我正在 ReasonReact 中写一个表单。我用reducerComponent
和一个记录作为状态。假设我有这样的事情:
type state = {
field1: string,
field2: int,
};
type action =
| SetField1(string)
| SetField2(int);
let component = ReasonReact.reducerComponent("SomeComponent");
let make = ( _children) => {
...component,
initialState: () => {field1: "", field2: 0},
reducer: (action, state) => switch(action) {
| SetField1(value) => ReasonReact.Update({...state, field1: value})
| SetField2(value) => ReasonReact.Update({...state, field2: value})
},
render: ({state, send}) =>
<div>
<input value={state.field1} onChange={e => send(SetField1(getValue(e)))} />
<input value={state.field2 |> string_of_int} onChange={e => send(SetField2(e |> getValue |> int_of_string))} />
</div>,
}
在这个例子中只有 2 个字段,但是如果有例如 30 个字段如何处理呢?这是否意味着我必须创建 30 个不同的动作并在 reducer 中处理 30 次?这是很多无关紧要的代码。有什么方法可以更动态地修改记录,或者我应该使用另一种结构来表示状态(对象,Js.t)?
为了澄清我在两种情况下使用这种形式:
- 将状态转换为 Js.Json.t(使用 bs-json)并发送到服务器(使用 bs-fetch)
- 使用 reason-apollo (graphql) 作为突变将其发送到服务器。