【问题标题】:React trying to assign props to state variable doesn't work尝试将道具分配给状态变量的反应不起作用
【发布时间】:2020-12-13 07:00:38
【问题描述】:

我正在尝试分配从父组件获得的道具并将其分配给子组件中的状态(因为我想操作道具数据,所以我首先将其分配给状态)。

当我记录状态变量时,它作为一个空数组出现,但是当我在渲染中创建一个新变量并将道具分配给它并记录它时。它确实显示了我需要的数据。另外,当我登录this.props 时,我肯定可以看到 props 包含我需要的数据。

我之前已经多次指定 props 来声明,所以我不确定这次有什么不同以至于它不起作用。

我将 props 传递给子组件的父组件:

  <ShowAvailableTimeslots onClick={this.getSelectedTimeslot} allTimeSlots={this.state.AvailabletimeSlots} /> 

我尝试将道具分配给状态的子组件:

class ShowAvailableTimeslots extends Component {
    constructor(props) {
      super(props)
        this.state = {
            sliceEnd: 5,
            sliceStart:0,
            selectedSlotValue: "",
            timeSlotArr: this.props.allTimeSlots,
            // timeSlotSlice: timeSlotArr.slice(this.state.sliceStart, this.state.sliceEnd)
        }
      
    }

    handleTimeSlotClick = (timeSlot) => {
        this.setState({ selectedSlotValue: timeSlot }, () => {
            this.props.onClick(this.state.selectedSlotValue)
            console.log('time slot value', timeSlot)
          
        });
    }
    previousSlots =()=>{
        var test;
    }
    forwordSlots =()=>{
        var test;
    }    

    
    render() {
         var timeSlotArrRender = this.props.allTimeSlots; 
        return (
            <React.Fragment>

                {console.log("state", this.state.timeSlotArr)} // --> doesn't show data
                {console.log("props", this.props)} // --> does show data
                {console.log("render variable", timeSlotArrRender )} // --> does show data


                <button className="button btn" onClick={() => this.previousSlots()} disabled={this.state.sliceStart === 0}>left</button>
                {/* {this.state.timeSlotArr.map(timeSlot => <a className="timeslot btn " key={timeSlot} value={timeSlot} onClick={() => this.handleTimeSlotClick(timeSlot)}>{timeSlot}</a>)
                } */}
                <button className="button btn">right</button>

            </React.Fragment>
        )
    }
}

export default ShowAvailableTimeslots

【问题讨论】:

    标签: javascript reactjs state parent-child react-props


    【解决方案1】:

    在组件生命周期开始时调用构造函数。 您正在从父级传递 this.state.AvailabletimeSlots ,到那时构造函数已经被调用并且 timeSlotArr 的分配已经完成,所以

    timeSlotArr: this.props.allTimeSlots // will not work
    

    你必须得到生命周期方法或钩子的帮助

    componentWillReceiveProps(nextProps){
       this.setState({timeSlotArr: nextProps.allTimeSlots })
    } 
    

    根据你必须使用的新变化

    static getDerivedStateFromProps(nextProps, prevState){
       return {
          timeSlotArr: nextProps.allTimeSlots
      };
    }
    

    【讨论】:

    • 我将您代码的最后一个代码块粘贴到我的项目中,但出现此错误× TypeError: Cannot read property 'setState' of undefined
    • 仅供参考,编辑了我的答案,您不能在静态函数中使用“this”。
    • 我又查看了getDerivedStateFromProps,因为我不确定如何正确实施它,但它确实有效,谢谢!我从这个答案中学到了很多东西。
    【解决方案2】:

    我让它工作得很好。 https://jsfiddle.net/85zc4Lxb/

    class App extends React.Component {
      render() {
        return (<Child passing="I am being passed to child" />);
      }
    }
    
    class Child extends React.Component {
      constructor(props) {
        super(props)
          this.state = {
            passedProp: this.props.passing,
          }
      }
    
      render() {
          return (
              <React.Fragment>
                <button>{this.state.passedProp}</button>
              </React.Fragment>
          )
      }
    }
    
    ReactDOM.render(
      <App />,
      document.getElementById('container')
    );
    
    

    【讨论】:

      【解决方案3】:

      我尝试重新创建场景,它可以再次尝试保存所有文件,然后检查

      父组件

      import React, { Component } from "react";
      import TestOne from "./Components/TestOne/TestOne";
      
      export class App extends Component {
        state = {
          x: "x data",
          y: "y data",
        };
        render() {
          return (
            <div>
              <TestOne x={this.state.x} allTimeSlots={this.state.y}/>
            </div>
          );
        }
      }
      
      export default App;
      

      子组件

      import React, { Component } from "react";
      
      export class TestOne extends Component {
        constructor(props) {
          super(props);
          this.state = {
            sliceEnd: 5,
            sliceStart: 0,
            selectedSlotValue: "",
            timeSlotArr: this.props.x,
          };
        }
        render() {
          var timeSlotArrRender = this.props.allTimeSlots;
          return (
            <React.Fragment>
              {console.log("state", this.state.timeSlotArr)}
              {console.log("props", this.props)}
              {console.log("render variable", timeSlotArrRender)}
      
              <button className="button btn">right</button>
            </React.Fragment>
          );
        }
      }
      
      export default TestOne;
      

      结果:

      【讨论】:

        【解决方案4】:

        我认为你错过了this.setState({})

        【讨论】:

          猜你喜欢
          • 2017-08-07
          • 2015-07-16
          • 1970-01-01
          • 2019-11-16
          • 1970-01-01
          • 1970-01-01
          • 2017-08-22
          • 1970-01-01
          • 2017-11-19
          相关资源
          最近更新 更多