вставлю свои пять копеек.
1)
Имеет ли смысл многоуровневая вложенность компонентов, если, например, данные передаются вверх через пару-тройку уровней?
если не вдаваться в философию про идеальную архитектуру, то имеет ли смысл определяете вы сами. Только вам известна логика компонента и то как он гипотетически будет развиваться в будущем. Обобщенно - если это самое простое решение, не мешает дальнейшей поддержке/расширению кода и удовлетворяет хотя бы принцип single responsibility то да, имеет. На практике если имеется передача на несколько уровней вверх - чаще всего проще отрефакторить.
2)
Так файлы короче, но страшно становится, если через useState-ы ререндерить родителей по такой лестнице…
Возможно не до конца понял вопрос. Потому отвечаю как понял)
можно забить и делать как удобно, если это не противоречит здравому смыслу. Если используете пропс дриллинг, просто не злоупотребляйте кол-вом стейтов во вложенных компонентах. По возможности изолируйте дочерний код в стейтлес компоненты. Лучше старый добрый коллбек чем строить пирамиду состояний.
Была идея вообще в хранилище построить нечто вроде описательной структуры, чтобы все связи шли через state-ы, ну типа как объекты в Vue.
Советую подсмотреть существующие подходы в реакте. Все велосипеды уже изобретены до вас.
В принципе, это мое первое приложение, и я готов к тому, что оптимально не будет, лишь бы работало с приемлемым гемором при поддержке…
Но… Может кто-то порекомендует, как лучше построить иерархию, чтобы, для первого раза, не так напряжно?
Мой совет - делайте как получается. Если это первый пет, не задавайтесь вопросами про глубокую оптимизацию структуры и тд. Понаступайте на свои личные грабли, и со временем и опытом вопрос как лучше отпадет сам собой.