我需要幫助,圍繞從深層嵌套的子/孫更新父狀態的最佳方法。React從表單構建器中的深層嵌套子節點向下更新狀態
我使用React創建表單生成器,允許用戶通過在localeStorage中保存持久狀態來創建,預覽和導出表單。表格有問題,每個問題都有可能的子問題。
我的想法是保持的應用層上的所有問題的狀態,分配localStorage.setItem(「問題」,this.state.questions)
的數據結構如下:
[
{ question='question 1',
type='text',
condition=null,
isSub= false,
subQ=[{
question='sub question 1',
...
isSub=true,
subQ=[]
}]
},
{
question='question 1',
...
isSub= false,
subQ=[]
},
question='question 1',
...
isSub= false,
subQ=[]
}
]
我的組件層次結構是應用程序 - >問題表達式 - >問題。 應用程序保持所有問題的狀態,問題管理自己的onChange調用updateInputValue,它更新值然後調用綁定到QuestionForm組件的updateParent(key,update)。然後QuestionForm調用綁定到App的updateQuestions(update)。這適用於最外層的問題。通過對子問題所做的更改來更新App狀態的最佳方法是什麼?
class Question extends Component{
constructor(props){
super(props)
this.state = {
question: props.question
}
this.updateInputValue = this.updateInputValue.bind(this)
}
.....
updateInputValue(e){
let { name, value } = e.target,
question = {...this.props.question }
if(!name){
value = e.target.parentElement.getAttribute('name') ||
e.target.getAttribute('name')
name = 'type'
}
question[name] = value
this.setState({question: question})
this.props.updateParent(this.props.id, question)
}
這是我如何渲染問題 內每個問題的子問題渲染()組件
{ question.subQ.map((q, i) =>
<Question key={i}
question={q}
updateParent={this.props.updateParent} />) }
QuestionForm組件內的updateParent功能
updateParent = (key, prop) => {
let questions = {...this.state.questions }
questions[key] = prop
this.props.updateQuestions(questions)
}
最後,應用程序組件
class App extends Component {
constructor(props){
super(props)
this.state = {
questions: sample,
activeItem: 'Create'
}
this.checkStorage = checkStorage
this.addQuestion = addQuestion.bind(this)
this.handleTabClick = this.handleTabClick.bind(this)
this.updateQuestions = this.updateQuestions.bind(this)
}
updateQuestions(update){
this.setState({questions: update})
}
我正在考慮自下而上的方法,通過跟蹤parentKeys並爬上樹直到'isSub'=== false。有沒有更好的方法來解決這個問題?
那麼另一種方法是隻需要使用redux或類似的東西傳遞給每個組件的狀態標誌包。 –