Reactjs 从异步源重新组合初始状态值

Reactjs 从异步源重新组合初始状态值,reactjs,recompose,Reactjs,Recompose,在重新组合中的以下示例中,带状态的初始值为空字符串。如果您需要一个来自数据库或动态源的值,您将如何让它更新该属性更改 例如: withState('value', 'updateValue', (user) => user.name) 来自的原始代码重新组合 const enhance = compose( withState('value', 'updateValue', ''), withHandlers({ onChange: props => event =

重新组合
中的以下示例中,
带状态
的初始值为空字符串。如果您需要一个来自数据库或动态源的值,您将如何让它更新该属性更改

例如:

withState('value', 'updateValue', (user) => user.name)
来自
的原始代码重新组合

const enhance = compose(
  withState('value', 'updateValue', ''),
  withHandlers({
    onChange: props => event => {
      props.updateValue(event.target.value)
    },
    onSubmit: props => event => {
      event.preventDefault()
      submitForm(props.value)
    }
  })
)

const Form = enhance(({ value, onChange, onSubmit }) =>
  <form onSubmit={onSubmit}>
    <label>Value
      <input type="text" value={value} onChange={onChange} />
    </label>
  </form>
)
const enhance=compose(
使用state('value','updateValue',''),
带处理器({
onChange:props=>event=>{
props.updateValue(event.target.value)
},
onSubmit:props=>event=>{
event.preventDefault()
提交表单(道具值)
}
})
)
const Form=enhance({value,onChange,onSubmit})=>
价值
)

鉴于上述示例,我只是进行了分支

v4我似乎有竞争条件,所以我确保这些特定组件在加载完成之前不会渲染。现在我可以回到原来的代码

v3以下内容很有用,也许它们是我可以在重组中使用的更好的方法或工具

withState('value', 'updateValue', ''),
withPropsOnChange(['name'], (props) => assign(props, { value: props.name })),
v2通过删除
分支
并使用propsonchange添加
,我能够实现我想要的。(或者看起来是这样)

v1第一次尝试:(效果不太好)

const enhance=compose(
分支机构(
({name})=>!name,
无渲染
)
带状态('value','updateValue',({name})=>name),
带处理器({
onChange:props=>event=>{
props.updateValue(event.target.value)
},
onSubmit:props=>event=>{
event.preventDefault()
提交表单(道具值)
}
})
)
const Form=enhance({value,onChange,onSubmit})=>
价值
)

鉴于上述示例,我只是进行了分支

v4我似乎有竞争条件,所以我确保这些特定组件在加载完成之前不会渲染。现在我可以回到原来的代码

v3以下内容很有用,也许它们是我可以在重组中使用的更好的方法或工具

withState('value', 'updateValue', ''),
withPropsOnChange(['name'], (props) => assign(props, { value: props.name })),
v2通过删除
分支
并使用propsonchange添加
,我能够实现我想要的。(或者看起来是这样)

v1第一次尝试:(效果不太好)

const enhance=compose(
分支机构(
({name})=>!name,
无渲染
)
带状态('value','updateValue',({name})=>name),
带处理器({
onChange:props=>event=>{
props.updateValue(event.target.value)
},
onSubmit:props=>event=>{
event.preventDefault()
提交表单(道具值)
}
})
)
const Form=enhance({value,onChange,onSubmit})=>
价值
)

您可以在状态下异步获取值,然后调用更新程序。 建议在
componentDidMount

const enhancer=compose(
带状态('value','updateValue',({name})=>name),
带处理器({
onChange:props=>event=>{
props.updateValue(event.target.value)
},
onSubmit:props=>event=>{
event.preventDefault()
提交表单(道具值)
}
}),
生命周期({
组件安装(){
fetchName().then(this.props.updateValue)
}
}),
分支(({name})=>!name,()=>null)
)

您可以在状态下异步获取值,然后调用更新程序。 建议在
componentDidMount

const enhancer=compose(
带状态('value','updateValue',({name})=>name),
带处理器({
onChange:props=>event=>{
props.updateValue(event.target.value)
},
onSubmit:props=>event=>{
event.preventDefault()
提交表单(道具值)
}
}),
生命周期({
组件安装(){
fetchName().then(this.props.updateValue)
}
}),
分支(({name})=>!name,()=>null)
)

从上述实现中弹出一个问题,如果
name
属性不存在,则对于从未创建过name属性的用户,表单将永远不会加载。从上述实现中弹出一个问题,如果
name
属性不存在,则对于从未创建过name属性的用户,表单将永远不会加载。@lsaddo yea,感谢您的帮助并链接到文档。我通常试图避免使用生命周期,但这是有道理的。@lsaddo是的,谢谢你的建议和链接到文档。我通常试图避免生命周期,但这是有道理的。
const enhance = compose(
  branch(
    ({ name }) => !name,
    renderNothing
  )
  withState('value', 'updateValue', ({ name }) => name),
  withHandlers({
    onChange: props => event => {
      props.updateValue(event.target.value)
    },
    onSubmit: props => event => {
      event.preventDefault()
      submitForm(props.value)
    }
  })
)

const Form = enhance(({ value, onChange, onSubmit }) =>
  <form onSubmit={onSubmit}>
    <label>Value
      <input type="text" value={value} onChange={onChange} />
    </label>
  </form>
)