簡體   English   中英

我如何setObject.item [n]的狀態嵌套在數組中,而該數組嵌套在對象數組中

[英]How do I setState of object.item[n] nested within array which is nested within an array of objects

我有以下數據結構:

 const library = [ { procedureName:'Build Foundations', id:1, tasks:[ { taskName:'dig at least 1m deep', isCompleted:false, procedureId:1 }, { taskName:'At least 50m wide digging', isCompleted:false, procedureId:1 }, { taskName:'Buy megazords', isCompleted:false, procedureId:1 } ] }, { procedureName:'Building the roof', id:2, tasks:[ { taskName:'Constructed according to the project', isCompleted:false, procedureId:2 }, { taskName:'Protect wood from humidity', isCompleted:false, procedureId:2 }, { taskName:'Roof build with the correct angle', isCompleted:false, procedureId:2 } ] } ] 

我希望我的功能onTaskToggle到的setState library.tasks.isCompleted這樣的: library.tasks.isCompleted: !library.tasks.isCompleted (我希望能夠分辨某些項目的點擊也一樣)我不知道怎么弄到這個狀態。

我應該以其他方式構建數據結構還是缺少什​​么?

 onTaskToggle = (task) => { const findProcedure = library => library.filter(procedure => procedure.id === task.procedureId); const findTask = tasks => tasks.filter(singleTask => singleTask.taskName === task.taskName); const toggledTask = findTask(findProcedure(this.state.library)[0].tasks); const procedureIndex = this.state.library.indexOf(findProcedure(this.state.library)[0]); const toggledTaskIndex = this.state.library[procedureIndex].tasks.indexOf(toggledTask[0]); const insideProcedure = this.state.library[procedureIndex]; const insideTask = this.state.library[procedureIndex].tasks.indexOf(toggledTask[0]); this.setState({ // Stuck there ...library }) } 

我不確定是否需要它,但這就是我傳遞數據的方式:

 // Main component class App extends Component { constructor(props){ super(props); this.state = { projects, library, } } onTaskToggle = (task) => { const findProcedure = library => library.filter(procedure => procedure.id === task.procedureId); const findTask = tasks => tasks.filter(singleTask => singleTask.taskName === task.taskName); const toggledTask = findTask(findProcedure(this.state.library)[0].tasks); const procedureIndex = this.state.library.indexOf(findProcedure(this.state.library)[0]); const toggledTaskIndex = this.state.library[procedureIndex].tasks.indexOf(toggledTask[0]); const insideProcedure = this.state.library[procedureIndex]; const insideTask = this.state.library[procedureIndex].tasks.indexOf(toggledTask[0]); this.setState({ // ...library }) } render() { const {projects, library} = this.state; return ( <div> <Procedures library={library} onTaskToggle={this.onTaskToggle}/> </div> ); } } 

 export default class Procedures extends Component { constructor(props) { super(props); this.state = { }; } render() { return ( <div> { <ProceduresList library={this.props.library} onTaskToggle={this.props.onTaskToggle}/> } </div> ); } } 

 //Mapping through procedures const ProceduresList = props => { const list = props.library.map(procedure => { const { id, procedureName, tasks } = procedure; return( <div key={id}> <h4>{procedureName} </h4> <div><ListingTasks tasks={tasks} onTaskToggle={props.onTaskToggle}/></div> </div> ) }) return <div>{list}</div> } export default ProceduresList; 

 // Last Component where all the magic shall happen const ListingTasks = (props) => { const list = props.tasks.map(task => { // under this line goes mapping through procedures const taskName = task.taskName; return <div key={taskName} onClick={() => props.onTaskToggle(task)}>{taskName}</div> }) return <div>{list}</div> } export default ListingTasks 

onTaskToggle(task) {
    const { library } = this.state
    const procedure = Object.assign({}, library.find(proc => (proc.id === task.procedureId)))
    const procedureIndex = library.findIndex(prec => prec.id === procedure.id)

    procedure.tasks = procedure.tasks.map((tsk) => {
      if (tsk.taskName === task.taskName) {
        tsk.isCompleted = !tsk.isCompleted
      }
      return tsk;
    })

    library.splice(procedureIndex, 1, procedure)

    this.setState({ library })
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM