I primarily use ReactJS.
We used a domain-driven pattern. Although there is still that component parent hierarchy thing going on.
TDD (tech design doc), write the code, linter, unit tests (Jest/Enzyme eg. render part of component take code snapshot, assert stuff) and then WDIO for visual regression testing (image diffs). It is a time consuming thing to setup but when you have like 600tests it's nice/assuring. Then it runs on a pipeline (Jenkins) for about an hour before it gets released to some domain.
Personally I am still in the get it done/MVP stage. The above is ideal case when you're established/dealing with many other people changing code.
I am going with a Selenium/functional test though personally for the thing I'm working on now (2-way real time interactive app).
There's different ways to test stuff depends what your thing is. The TAs I worked with use Eggplant.
The main thing though about separation of concerns is important when possible just to reduce cognitive load for the next stuff you add.