【发布时间】:2020-01-26 03:13:14
【问题描述】:
我有一个父功能组件<EditCard/>,它是在选择编辑表行按钮时打开的模式。此编辑卡包含一个名为data 的状态变量,其中包含正在编辑的表格行中的数据。我正在使用useState 钩子设置/修改<EditCard/> 的状态。
<EditCard/> 有一个子组件 <CategoryDropdown/>,它是一个下拉列表,接受一个 prop data.assignCategory 作为其选定值和一个回调 handleChange(),它使用从下拉列表中选择的值更新状态值 data。
当我从下拉列表中选择一个新值时,handleChange() 被调用,setData() 被调用,我看到状态正在更新,但 <CategoryDropdown/> 没有使用新选择的值重新呈现。
EditCard 组件代码
export default function EditCard(props) {
const [data, setData] = useState(props.data);
const handleChange = () => event => {
let d = data;
d.assignCategory = event.target.value;
setData(d);
};
let assignCategoryCol = data.assignCategory !== undefined ? <AssignCategoryCol data={data} handleChange={handleChange}/> : <></>;
return (
<div>
{assignCategoryCol}
<Button>Update</Button>
</div>
)
}
{props.data.bucketTotal}`} <Lock/></Typography>)
};
const AssignCategoryCol = (props) => {
return (
<CategoryDropdown id={props.data.id} assignedCategory={props.data.assignCategory} handleDropdownChange={props.handleChange}/>)
};
const useStyles = makeStyles(theme => ({}));
CategoryDropdown 组件
class CategoryDropdown extends Component {
constructor(props) {
super(props);
//TODO Get Categories from DB and set default
this.state = {
categories: ['Select One', 'Category1', 'Category2', 'Category3'],
};
}
render() {
return (
<div id={'categoryDropdown'}>
<Select onChange={this.props.handleDropdownChange(this.props.id)} value={this.props.assignedCategory}>
{this.state.categories.map((category) => {
return <MenuItem value={category}>{category}</MenuItem>
})}
</Select>
</div>
)
}
}
const styles = theme => ({});
export default withStyles(styles)(CategoryDropdown)
【问题讨论】:
-
React 不会知道对象中只有一个键(即存储到状态)发生了变化。您需要一起替换整个对象。通过复制处于该状态的对象(创建一个新对象),使用您要添加的值更改该对象来执行此操作。然后,将这个新对象存储到状态中。换句话说,完全替换原来的对象。
标签: javascript reactjs react-hooks