完全被这个 reactjs 逻辑难住了,变量没有更新组件的状态

Posted

技术标签:

【中文标题】完全被这个 reactjs 逻辑难住了,变量没有更新组件的状态【英文标题】:Completely stumped at this reactjs logic, of a variable not updating the state of a component 【发布时间】:2017-12-25 07:48:25 【问题描述】:

我正在使用recharts,如果data 变量在类之外,它可以正常工作。发生的情况是它加载、动画图形并显示“点”坐标。但是,如果 data 变量在类内部,它不会动画,也不会更新“点”坐标 css。

注意渲染方法中注释掉的数据,如果我取消注释,并注释掉顶部数据变量,它不起作用,但这个当前设置工作得很好。任何修复的想法?一旦这个问题得到修复,我最终想加载 this.props.data 而不是 data

const data = [ name: '07/14/2017', mood: 6 ,  name: '07/15/2018', mood: 7 ];

class LinearGraph extends Component 

  constructor(props) 
    super(props);

  

  render() 
    //const data = [ name: '07/14/2017', mood: 6 ,  name: '07/15/2018', mood: 7 ];

    return (
      <ResponsiveContainer  >
        <LineChart
          data=data
          margin= top: 5, right: 50, left: 0, bottom: 5 
        >
          <XAxis dataKey="name" />
          <YAxis />
          <CartesianGrid
            strokeDasharray="3 3"
            horizontal=false
          />
          <Tooltip />
          <Legend />
          <Line
            type="monotone"
            dataKey="mood"
            stroke="rgba(43, 191, 217, 0.9)"
            dot= stroke: '#ff0000', strokeWidth: 12  // this isn't working at all
            activeDot= r: 1 
            strokeWidth=5
          />
          <ReferenceLine y=7 label="Max" stroke="green" strokeDasharray="3 3" />
        </LineChart>
      </ResponsiveContainer>
    );
  


也为了更直观的理解,在这张照片中它是它工作的时候(不能显示动画,但你可以看到“点”坐标正在工作):

在这里它不起作用:

编辑:我也尝试在 componentWillMount 中设置状态(和 componentDidMount 但后者给出了警告):

class LinearGraph extends Component 
  constructor(props) 
    super(props);
    this.state = 
      data: [],
    ;
  

  componentWillMount() 
    this.setState( data: this.props.data );
  

  render() 
    return (
      <ResponsiveContainer  >
        <LineChart data=this.state.data />
      </ResponsiveContainer>
    );
  


【问题讨论】:

你需要遵循 React 生命周期,它会根据 prop 和 state 的变化重新渲染。您可以将data 定义为组件state 的属性吗? 如果在构造函数中我设置了 this.state = data: this.props.data,它是未定义的。现在如果我将它设置为一个空数组,我不能在渲染方法中执行 this.setState(data: this.props.data) ,它会引发大量错误,并且不确定我还能在哪里设置它由于异步加载。我不能让它成为类中的函数,然后出于同样的原因在渲染中调用它。 @JordanBonitatis 我也尝试将 this.setState 添加到 componentWillMount 和 componentDidMount。这很奇怪,因为 this.state.data 显示的是一个空数组,而 this.props.data 在方法内的控制台日志中工作得很好,因为它是异步更新的。 您似乎在构造函数中设置initialState 处于正确的轨道上。如果库不喜欢空数组,您可以将其作为带有单个空对象的数组启动,例如data: []? (诚​​然,如果不了解图书馆的内部运作,这有点摸不着头脑) 我完全同意 Jordan 关于 React 生命周期的观点。对于异步数据,您需要使用 Kyle 在他的回答中显示的承诺。获取数据后,将设置状态。 【参考方案1】:

render 在状态变化时被调用。你需要复习一下反应component's lifecycle。最佳做法是声明您的状态,然后在生命周期 componentDidMount 函数中加载它。

class LinearGraph extends React.Component 
    constructor(props) 
        super(props);

        this.state = 
            data = []
        ;
    

    componentDidMount() 
        // Get your data here, from a const or an API
        fetch('api/get_data')
            .then(res => res.json()) // Get the json
            .then(res => this.setState(data: res.data)) // Consume the json
            .catch(err => alert('foo'));
    

    render() 
        return (
            <div>
                <LineChart data=this.state.data />
            </div>
            );
    

【讨论】:

酷,在你发帖之前我实际上是在玩这个。是否有可能让 componentDidMount 简单地拥有 this.setState(data: this.props.data),因为 fetch 发生在父组件中并且也将数据传递给其他子组件?因为我试过了,没用 实际上它给了我一个警告并说“不要在组件中设置状态确实挂载” 这比我评论的方法更有意义;我假设data 是静态/硬编码 试试componentWillMount 我尝试了 componentWillMount 和 componentDidMount。我刚刚用更新的编辑更新了我在底部的原始帖子。还是不行:(【参考方案2】:

哇,所以解决方法是打电话给componentWillReceiveProps,所以我只是添加了:

componentWillReceiveProps() this.setState( data: this.props.data );

它现在更新得很好,不需要回调或承诺

【讨论】:

好吧,没关系。这适用于初始加载,但如果我更改网站上的页面并返回,同样的问题。我看到了图形线,但点没有更新为适当的 css 颜色。

以上是关于完全被这个 reactjs 逻辑难住了,变量没有更新组件的状态的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类和访问

为啥变量没有更新?任何逻辑

我被难住了:如何使用 PHP Mailer 发送 HTML 表单

习题 4:变量和命名

面试字节跳动..没想到面试官出了3道逻辑题,把我给难住了..

无法解包可选。没有 UITableViewCell