如何在 React 渲染前设置 props

Posted

技术标签:

【中文标题】如何在 React 渲染前设置 props【英文标题】:How to set props before render in React 【发布时间】:2019-02-28 06:15:16 【问题描述】:

谁能告诉我为什么,当我在 componentWillMount() 方法中设置状态时,render() 中的一个函数在设置状态之前运行,即

这是我的应用程序:

class App extends Component 
  constructor(props)
    super(props);
    this.state=
      x : 50,
      y : 100,
      width : 200,
      height : 300
    
    this.handleDuplicate = this.handleDuplicate.bind(this);
  

  handleDuplicate(newDims)
    this.setState(newDims : newDims)
  

  render() 
    return (
      <div className="App">
        <header className="App-header">
          <img src=logo className="App-logo"  />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <svg id="svgOne"  >
          <NewRect 
            ...this.state
            handleDuplicate=this.handleDuplicate
          />
        </svg>
      </div>
    );
  

这是我的组件,NewRect:

import React,  Component  from 'react';

class NewRect extends Component 
  componentWillMount()
    let  x, y, width, height  = this.props
    let newDims = 
      x : x + 30,
      y : y + 30,
      width : width - 50,
      height : height + 50
    
    this.props.handleDuplicate(newDims);
  

  render() 
    console.log(this.props);
    return (
          <rect 
            x=this.props.x 
            y=this.props.y 
            width=this.props.width 
            height=this.props.height 
            fill="black" 
          />
    );
  


export default NewRect;

据我所知,componentWillMount() 的全部意义在于完成所有需要在 render() 之前完成的操作。

【问题讨论】:

仅供参考,在 eact 16 中,componentWillMount 被认为是遗留的,并且可能会在某些时候消失,正是因为 ots 的正确用法一直被误解。 【参考方案1】:

setState 是异步的,因此您不能假设使用新状态调用渲染。

您可以做的是创建一个名为“正在加载”或类似名称的状态变量,将其初始值设置为true,并在componentWillMount中将其设置为false。

在渲染中,当加载仍然为真时,您将显示一个微调器。

顺便说一句,我发现很难理解您的代码,但我确信 React 比我更聪明 :) 您将父级的状态作为道具传递给您的子组件,该子组件在父组件中运行一个可能会更改父级状态的函数,该状态作为道具传递......这不是最简单的事情,我希望它可以工作:)

我会尝试考虑一种更简单的方法来做到这一点,但我并不总是正确的,远非如此......

【讨论】:

【参考方案2】:

setState 是异步的。我怀疑发生了什么:

    App.render() 被调用 NewRect 被实例化 NewRect.componentWillMount() 被调用 App.handleDuplicate() 被调用 App.setState() 被调用 NewRect.render() 被调用 App.setState() 更改已执行 App.render() 被称为 新的道具被传递给NewRect NewRect.render() 被调用

最终这应该无关紧要。如果是这样,请考虑在NewRect 中镜像状态或在setState 上使用回调。如果您的模式依赖于同步渲染,您可能需要重新审视您的架构。 React 正在移动 toward fully asynchronous rendering。

【讨论】:

以上是关于如何在 React 渲染前设置 props的主要内容,如果未能解决你的问题,请参考以下文章

React 如何使用 data.props 内容做条件渲染

如何在 React 中渲染对象数组?

如何使用 React js 中的上下文将函数从 FUNCTIONAL 传递给 CLASS 组件并在渲染之外(没有 prop)访问它?

React:如何动画化渲染组件的变化?

如何在 React 中将 props 传递给 jest 测试

如何渲染重复的 React 元素?