【发布时间】:2015-10-26 14:19:54
【问题描述】:
我有一个组件:
React = require 'react'
module.exports = Toolbar = React.createClass
proptypes:
initialUrl: React.PropTypes.string
onUrlChange: React.PropTypes.func
getInitialState: ->
url: @props.initialUrl
handleUrlChange: (e) ->
@setState(url: e.target.value)
handleUrlKeyUp: (e) ->
if e.which == 13
e.target.blur()
if (url = @state.url.trim())? and url isnt @props.initialUrl
@props.onUrlChange?(url)
@setState {url}
if e.which == 27
@setState {url: @props.initialUrl}
render: ->
<div className="component-toolbar clearfix">
<input type="text" value={@state.url} onChange={@handleUrlChange} onKeyUp={@handleUrlKeyUp}/>
</div>
组件的工作方式如下:
- 它在内部呈现带有
initialUrl的输入。 - 用户可以更改它。
- 当用户敲击回车时,触发事件
onUrlChange。 - 当用户按下 esc 时,
@state.url恢复为原始值 (initialUrl)
到目前为止一切顺利。
但是当我更改上组件的道具或状态时,从 initalUrl 派生然后组件具有相同的状态并且不会重新渲染。这是因为 getInitialState 只被调用一次。但是解决这个问题的正确方法是什么?
谢谢。
【问题讨论】:
-
试试componentWillReceiveProps(nextProps)生命周期函数。
-
是的,这是一个选项。我试过了,没关系,但它看起来有点丑(hacky)。只是想知道什么是正确的方法。我猜这一定是一个常见的问题。
-
使用 componentWillReceiveProps 是正确的方法。为什么你认为它很hacky?
标签: reactjs coffeescript