重构异步 prop 更新
Recompose async prop update
当从视图组件外部更改 prop 时,如何使用 recompose 重新渲染组件?
const Message = ({msg}) => <div>The prop has a value of <b>{msg}</b>.</div>
const App = Recompose.withProps(() => {
let msg = 'One'
// this async update doesn't work because nothing triggers a rerender
setTimeout(() => {msg = 'Two'}, 500)
return {msg}
})(Message)
ReactDOM.render(<App/>, document.getElementById('app'))
渲染此组件时,它显示值 One 但在 500 毫秒后不会更改为 Two,即使它更改了道具
这里的setTimeout
简化了在实际用例中我订阅websocket服务器的情况,当消息被推送时,消息组件得到更新。
免责声明:我还没有主动使用 recompose。
但据我所知,您的组件应该是有状态的。我发现 withState
in recompose docs
const enhance = withState('counter', 'setCounter', 0)
const Counter = enhance(({ counter, setCounter }) =>
<div>
Count: {counter}
<button onClick={() => setCounter(n => n + 1)}>Increment</button>
<button onClick={() => setCounter(n => n - 1)}>Decrement</button>
</div>
)
所以我认为,您需要使用 withState
定义状态 msg
,然后您可以将 setMsg
传递到您的组件中。在您的 setTimeout
中调用此 setMsg
时,应执行更新。
const withMsg = withState('msg', 'setMessage', '');
当从视图组件外部更改 prop 时,如何使用 recompose 重新渲染组件?
const Message = ({msg}) => <div>The prop has a value of <b>{msg}</b>.</div>
const App = Recompose.withProps(() => {
let msg = 'One'
// this async update doesn't work because nothing triggers a rerender
setTimeout(() => {msg = 'Two'}, 500)
return {msg}
})(Message)
ReactDOM.render(<App/>, document.getElementById('app'))
渲染此组件时,它显示值 One 但在 500 毫秒后不会更改为 Two,即使它更改了道具
这里的setTimeout
简化了在实际用例中我订阅websocket服务器的情况,当消息被推送时,消息组件得到更新。
免责声明:我还没有主动使用 recompose。
但据我所知,您的组件应该是有状态的。我发现 withState
in recompose docs
const enhance = withState('counter', 'setCounter', 0)
const Counter = enhance(({ counter, setCounter }) =>
<div>
Count: {counter}
<button onClick={() => setCounter(n => n + 1)}>Increment</button>
<button onClick={() => setCounter(n => n - 1)}>Decrement</button>
</div>
)
所以我认为,您需要使用 withState
定义状态 msg
,然后您可以将 setMsg
传递到您的组件中。在您的 setTimeout
中调用此 setMsg
时,应执行更新。
const withMsg = withState('msg', 'setMessage', '');