与复杂对象反应setState

时间:2020-06-09 01:07:12

标签: javascript reactjs typescript react-hooks

在React组件中,我们从REST api(比如说Car)接收一个对象,允许用户进行更改,并最终保存结果。

为此,我们创建了一个自定义的react钩子来接收状态。一个示例可能如下所示:

type Car = {
  brand: string,
  color: string
}

type Props = {
  // A service that handles cars
  service: Service<Car>
}

function CarEditor(service: Service<Car>) {

   const { loading, error, resourceState } = useService(service);

   return <form>
     <input value={resourceState.brand} />
     <input value={resourceState.color} />
   </form>;


}

在上面的示例中,resourceState的类型为Car

我正在为如何对这辆车进行修改而苦苦挣扎。一种想法是,我们使用对setState的调用来对该对象进行管理:

function CarEditor(service: Service<Car>) {

   const { loading, error, resourceState } = useService(service);

   const [ car, updateCar ] = useState(resourceState);

   return <form>
     <input value={resourceState.brand} />
     <input value={resourceState.color} />
   </form>;

}

注意:为简洁起见,我省略了事件处理程序

问题:

  1. 我应该为Car的每个属性使用1个对useState的调用。对于复杂的对象,这似乎是很多重复,但是我担心使用整个对象是一种反模式。
  2. 与在主要组件中进行useService调用相比,updateResourceState本身公开一个useState函数并完全包含Car的状态会更好吗? li>

这一切都是新事物,我正在尝试以遵循最佳实践的方式来设计它,并且对就职的React开发人员而言,惊喜最小。

1 个答案:

答案 0 :(得分:3)

  1. 如果将复杂对象以某种状态存储在功能组件中,则不是反模式,建议使用 public function handle() { $datedi = Periodicity::select('pamatrixinf.dateen') ->where('pamatrixinf.cod_paperiodicity', '=', 1) ->first(); $now = Carbon::now(); if ($datedi->dateen < $now) { pamatrixinf::where('read_at', 1) ->where('cod_paperiodicity', 1) ->update(['read_at' => 0]); pamatrixinf::where('dateen','<', $now) ->update(['dateen' => 'dateen'->addDay()]); } }。并且您的nlp = stanza.Pipeline(lang='zh', processors='tokenize') Stanza_doc_open = open('Stanza_No_Tags.txt', 'r').read() doc = nlp(Stanza_doc_open) for i, sentence in doc.sentences: print(f'====== Sentence {i+1} =======', file=open('Stanza_Tokenized.txt', 'a')) 类型为useReducer一点也不复杂。
  2. 取决于您的resourceState。如果将Car作为状态存储在useService中,则只需在resourceState中进行更新useService函数并在resourceState组件中调用它,就可以了而且易于维护。