无法获取要根据另一个组件的状态呈现的组件的复选框

时间:2019-05-29 21:02:19

标签: javascript reactjs react-native

在组件未更新的情况下,我console.log this.state.checkedTeams和this.state.checked。这些值是通过componentDidUpdate中的映射确定的。他们按原样阅读。

但是,当我将控制台中的值记录在渲染器侧面时,会得到空数组。

当我尝试在componentDidUpdate中设置状态时,我超过了最大深度并抛出错误。

此功能的目标是能够根据外部组件的状态来调整this.state.checked。

import React, { Component } from 'react'
import { Text, View } from 'react-native'
import { connect } from 'react-redux'
import { loadTeams, loadLeagues } from '../actions'
import Check from './CheckBox'

class TeamSelect extends Component {
    constructor(props) {
        super(props)
        this.state = {
            checked: [],
            checkedTeams: [],
            setOnce: 0
        }
    }

    componentDidUpdate() {

        this.state.checked.length = 0

            this.props.team.map(
                (v, i) => {
                    if(this.props.checkedLeagues.includes(v.league.acronym)){
                        this.state.checked.push(true)
                        this.state.checkedTeams.push(v.team_name)
                    } else{
                        this.state.checked.push(false)
                    }
                }
            )

        console.log('checkedTeams', this.state.checkedTeams)
        console.log('checked', this.state.checked)
    }

    // componentDidUpdate(){
    //     if(this.state.checked.length === 0) {
    //         this.props.team.map(
    //             (v, i) => {
    //                 if(this.props.checkedLeagues.includes(v.league.acronym)){
    //                     this.state.checked.push(true)
    //                     this.state.checkedTeams.push(v.team_name)
    //                 } else{
    //                     this.state.checked.push(false)
    //                 }
    //             }
    //         )
    //     }


    //     console.log('checked league', this.props.checkedLeagues)
    // }

    changeCheck = (index, name) => {

        firstString = []

        if(!this.state.checkedTeams.includes(name)) {
            firstString.push(name)
        } else {
            firstString.filter(v => { return v !== name})
        }

        this.state.checkedTeams.map(
            (v, i) => {
                if(v !== name) {
                    firstString.push(v)
                }
            }
        )


        if(name === this.state.checkedTeams[0] && firstString.length === 0) {
            this.setState({ checkMessage: `Don't you want something to look at?` })
        } else {
            if(!this.state.checkedTeams.includes(name)){
                this.state.checkedTeams.push(name)
            } else {
                this.setState({checkedTeams: this.state.checkedTeams.filter(v => { return v !== name})})
            }
            this.state.checked[index] = !this.state.checked[index]
            this.setState({ checked: this.state.checked })

            // queryString = []

            // firstString.map(
            //     (v, i) => {
            //         if (queryString.length < 1) {
            //             queryString.push(`?league=${v}`)
            //         } else if (queryString.length >= 1 ) {
            //             queryString.push(`&league=${v}`)
            //         }
            //     }
            // )
            // axios.get(`http://localhost:4000/reports${queryString.join('')}`)
            //         .then(response => {
            //             this.props.loadCards(response.data)
            //         })
        }
                // console.log('first string', firstString)
                // console.log('in function', this.state.checkedTeams)
    }

    render() {console.log('in render - checkedTeams', this.state.checkedTeams)
    console.log('in render - checked', this.state.checked)

        return(
          <View>
              { 
                  this.props.team === null ?'' : this.props.team.map(
                      (v, i) => {
                         return(
                            <View key={i}>
                                <Check
                                    checked={this.state.checked[i]}
                                    index={i}
                                    value={v.team_name}
                                    changeCheck={this.changeCheck}
                                />

                               { v.team_name === undefined ? null :
                                <Text>{v.team_name}</Text>}
                            </View>

                            )
                      }
                  )
             }
          </View>
        )
    }
}

function mapStateToProps(state) {
    return {
      team: state.team.team,
      checkedLeagues: state.league.checkedLeagues
     }
   }

export default connect(mapStateToProps)(TeamSelect)

1 个答案:

答案 0 :(得分:1)

您直接在几个地方改变状态(非常糟糕)。您必须使用this.setState(new_state)或做出反应来放松对变化的跟踪。为了根据另一个组件的值更改一个组件的状态,您需要将从属组件作为控制组件的子组件,以便它可以接收值作为支持,或者需要将状态更改函数传递给控件。绑定到从属元素的控制元素。 阅读有关状态如何工作和解除状态的官方反应文档,以获取更多信息。 https://reactjs.org/docs/faq-state.html

https://reactjs.org/docs/lifting-state-up.html