【发布时间】:2018-04-11 12:48:14
【问题描述】:
我一直在传递从突变返回的数据来处理 Reactjs 中的表单验证。此模式不仅限于表单验证,还适用于其他具有相似要求的组件,其中某些内容被变异/查询,并且响应数据仅用于更新 UI。
概念:
<LoginForm/> 组件呈现登录表单并提交带有表单数据的loginMutation。验证发生在后端,如果验证捕获到任何错误,突变将使用字段errors 解决,其中包含键值对,其中键表示表单字段,值描述值的问题。想法是将errors 对象传递给<LoginForm/>,以便组件可以渲染/更新以在UI 中显示错误。
errors: {
username: "Username must not be empty",
password: "Password must not be empty"
}
挑战:
解析后的数据(errors)应该以什么方式传递给<LoginForm/>?最直接的锤钉方法是将回调函数从<LoginForm/> 传递给loginMutation,并在onComplete() 内部使用响应对象调用它。像这样的:
onCompleted: (response, errors) => { setLoginFormState(resonse.errors) }
那么在<LoginForm/>中就会有
setLoginFormState(validationState){
this.setState({errors: validationState })
}
最后我们可以像这样在<LoginForm/> 中相应地更新 UI
render(){
const { errors } = this.state;
const usernameClass = errors.username ? 'danger' : 'primary';
const passwordClass = errors.password ? 'danger' : 'primary';
return (
<div>
<input name="username" className={usernameClass} />
<input name="username" className={passwordClass} />
</div>
)
}
我正在寻找一种减少意大利面的方法。
我也期待宣布的schema extensions 功能,该功能目前缺少文档。似乎它的目的是通过允许我们将本地状态(例如 UI 状态)与从查询/突变中获取的持久数据混合来解决这个问题。
【问题讨论】:
标签: reactjs relay relaymodern react-relay