Reactjs useState未设置变量
我不明白为什么Reactjs useState未设置变量,reactjs,react-hooks,Reactjs,React Hooks,我不明白为什么useState没有根据变量的参数props设置变量 片段是: import React, { useState } from 'react'; const FormContainer = (props) => { console.log('[FormContainer props]', props); // line 7 const [prevState, setPrevState] = useState(props); console.log('[For
useState
没有根据变量的参数props
设置变量
片段是:
import React, { useState } from 'react';
const FormContainer = (props) => {
console.log('[FormContainer props]', props); // line 7
const [prevState, setPrevState] = useState(props);
console.log('[FormContainer]', prevState); // line 9
props
包含一个对象,但钩子未设置prevState
。它是未定义的
。为什么?
呼叫代码。第一个组件显示一个列表。单击列表(网格)中的一行时,此组件将获取数据并将其作为参数发送给第二个组件FormContainer
import React, { Component } from 'react';
import Table from './VehicleList';
import VehicleForm from '../FormContainer';
class Vehicles extends Component {
state = {};
...
render() {
return (
<div>
{this.state && this.state.vehicleList && (
<Table vehicleList={this.state.vehicleList} clicked={this.vehicleSelectedHandler} />
)}
{console.log('[Vehicles render selectedVehicle]', this.state.selectedVehicle)}
<VehicleForm vehicle={this.state.selectedVehicle} />
</div>
);
}
import React,{Component}来自'React';
从“/VehicleList”导入表;
从“../FormContainer”导入车辆表单;
类车辆扩展组件{
状态={};
...
render(){
返回(
{this.state&&this.state.vehicleList&&(
)}
{console.log('[Vehicles render selectedVehicle]',this.state.selectedVehicle)}
);
}
从调试器:
useState
将默认值作为其参数。它将仅在第一次渲染时设置,并且在props
更改时不会更新。您应该调用setPrevState
来更新值
useState
用于访问当前状态。如果您需要以前的道具或以前的状态,请查看
用钩子实现这一点不是一个好主意。车辆状态和更新应该在Vehicles
组件内。类内不需要useState
。VehicleForm
应该是一个无状态组件,应该接收一个回调来更新车辆
基于整个
props
对象,在通用FormContainer
中跟踪更改和处理更新是很困难的。它没有在原始调用中设置。您是否建议创建钩子并立即调用第二个参数setPrevState?我不应该将其命名为prev。@user2443507代码这个。state.selectedVehicle
表示在第一次渲染期间未选择任何内容,仅在一些用户交互=>之后,您需要显式调用setter,而不是依赖第一次渲染的默认值进行多次重新渲染。React限制渲染的数量以防止无限循环。▶ 折叠了2个堆栈框架。FormContainer src/containers/FormContainer.js:9 6 | const FormContainer=(props)=>{7 | console.log('[FormContainer props]',props);8 | const[prevState,setPrevState]=useState();>9 | setPrevState(props);我更新了我的答案。您可能应该改变方法或使用一些现有库来处理表单。为什么需要FormContainer
中的useState
?如何使用prevState
?请添加所有相关代码。您可能需要某种形式的useffect
调用代码通过PI调用并将其传递给表单。我希望表单传回已编辑的数据以便过帐。