在React.js中使用componentWillMount等函数的目的是什么?

时间:2015-05-05 01:50:57

标签: javascript user-interface reactjs frontend react-jsx

我最近在React.js中编写了组件。我从未使用componentWillMountcomponentDidMount等方法。

render是不可或缺的。我写的getInitialState和其他辅助方法也派上用场了。但不是上述两种生命周期方法。

我目前的猜测是它们用于调试?我可以在其中调用console.log:

componentWillMount: function() {
  console.log('component currently mounting');
},

componentDidMount: function() {
  console.log('component has mounted');
} 

还有其他用途吗?

5 个答案:

答案 0 :(得分:25)

如果您想使用一些非React JavaScript插件,

componentDidMount非常有用。例如,React中缺少一个好的日期选择器。 Pickaday很漂亮,开箱即用。所以我的DateRangeInput组件现在使用Pickaday作为开始和结束日期输入,我把它连接起来:

  componentDidMount: function() {
    new Pikaday({
      field: React.findDOMNode(this.refs.start),
      format: 'MM/DD/YYYY',
      onSelect: this.onChangeStart
    });

    new Pikaday({
      field: React.findDOMNode(this.refs.end),
      format: 'MM/DD/YYYY',
      onSelect: this.onChangeEnd
    });
  },

需要为Pikaday呈现DOM以连接它,componentDidMount钩子可以让你挂钩到那个确切的事件。

当您想要在组件安装之前以编程方式执行某些操作时,

componentWillMount非常有用。我正在研究的一个代码库中的一个例子是mixin,它有一堆代码,否则这些代码将被复制到许多不同的菜单组件中。 componentWillMount用于设置一个特定共享属性的状态。可以使用componentWillMount的另一种方法是通过prop(s)设置组件分支的行为:

  componentWillMount() {
    let mode;
    if (this.props.age > 70) {
      mode = 'old';
    } else if (this.props.age < 18) {
      mode = 'young';
    } else {
      mode = 'middle';
    }
    this.setState({ mode });
  }

答案 1 :(得分:4)

componentDidMount只在客户端运行一次。这很重要,特别是如果您正在编写同构应用程序(在客户端和服务器上运行)。您可以使用componentDidMount执行要求您有权访问窗口或DOM的任务。

来自Facebook的React Page

If you want to integrate with other JavaScript frameworks, set timers using setTimeout or setInterval, or send AJAX requests, perform those operations in this method.

componentWillMount用例较少(我并没有真正使用它),但它的不同之处在于它在客户端和服务器端运行。您可能不希望在此处放置事件侦听器或DOM操作,因为它会尝试在服务器上无缘无故地运行。

答案 2 :(得分:0)

这是使用componentWillMount的同构Web应用程序示例:https://github.com/coodoo/react-redux-isomorphic-example

但是,我99%肯定它在服务器端没有任何理由运行componentWillMount内的代码(我认为使用componentDidMount确保它只运行客户端会产生更多感觉)作为确保在呈现页面之前满足获取承诺的代码在server.js中不在单个组件内。

在这里讨论了每个组件的异步提取:https://github.com/facebook/react/issues/1739据我所知,就同构至少而言,componentWillMount没有一个好的用例。

答案 3 :(得分:0)

在我的项目中,这是一个仪表板工具,我使用了componentDidMount()。

在主页上,以前保存的仪表板显示在侧栏上。我在组件呈现主页的componentDidMount()中进行了ajax调用,以便在呈现页面后异步获取仪表板列表。

答案 4 :(得分:-2)

  

为什么要反应生命周期方法?

打算将第三方(Ex D3.js)库与React Component

一起使用
class Example extends React.component{
  constructor(){
    // init state
    // will be called only once
  }  
  componentWillMount(){
    // will be called only once
    // will not be triggered when re-rendering
    // usually will fetch data that is needed in order 
    // to render properly from other API
  }
  shouldComponentUpdate(){
      return false
      // will not re-render itself after componentDidMount(){}
  }
  render(){
    return (
      <div id="chart"></div>
    )
  }
  componentDidMount(){
    d3.select(".chart")
      .selectAll("p")
      // d3.js ........
      // d3.js ........
      // Usually, this will trigger React to re-render itself,
      // but this time will not because we have set 
      // shouldComponentUpdate to false
  }
}
  

为什么React想要这样做?

由于渲染DOM是一项昂贵的操作,因此React使用虚拟DOM层来仅更新与先前状态不同的DOM / DOM。