有一个父组件 List.js,在其中的 componentDidMount 挂钩上,我获得了我将在此组件中使用的类别以及我想在子 AddPostForm.js 中使用的类别。在AddPostForm组件中,我在状态中有一个title,body是两个input,category指的是select标签,当在这个select中选择了一个选项,就赋值给了category。问题是在初始化AddPostForm组件时,我需要在category中设置默认值(取this.props.categories[0].name中的第一个元素)。如何正确地做到这一点?
AddPostForm.js
import React from 'react';
import postApi from '../../services/postApi';
class AddPostForm extends React.Component {
constructor(props) {
super(props);
this.state = {
title: '',
body: '',
category: ''
};
}
handleInputChange = event => {
const name = event.target.name;
const value = event.target.value;
this.setState({
[name]: value
});
};
formSubmit = async event => {
event.preventDefault();
const { status, data } = await postApi.addPost({
title: this.state.title,
body: this.state.body,
category: this.state.category,
});
if (status === 200) {
this.setState({
title: '',
body: '',
category: this.props.categories[0].name
});
this.props.addPost(data);
}
};
render() {
return (
<form onSubmit={this.formSubmit} className="mb-3">
<div className="form-group">
<input type="text" name="title" className="form-control" value={this.state.title} onChange={this.handleInputChange} />
</div>
<div className="form-group">
<textarea name="body" className="form-control" value={this.state.body} onChange={this.handleInputChange} />
</div>
<div className="form-group">
<select className="form-control" name="category" value={this.state.category} onChange={this.handleInputChange}>
{this.props.categories.map(item => (
<option key={item._id}>{item.name}</option>
))}
</select>
</div>
<button className="btn btn-primary">Add</button>
</form>
);
}
}
export default AddPostForm;
List.js
import React from 'react';
import categoryApi from '../../services/categoryApi';
import AddPostForm from './AddPostForm';
class List extends React.Component {
constructor(props) {
super(props);
this.state = {
posts: [],
categories: [],
};
}
componentDidMount() {
categoryApi.getCategories().then(response => {
if (response.data.length) {
this.setState({
categories: response.data
});
}
});
}
addPost = async post => {
this.setState(prevState => ({
posts: [...prevState.posts, post],
}));
};
render() {
return (
<div className="shadow p-3 mt-4">
<AddPostForm categories={this.state.categories} addPost={this.addPost} />
</div>
);
}
}
export default List;
首先
componentDidMount
,不是一个钩子,而是一个生命周期其次,为了初始化默认值,你不需要像这样
this.props.categories[0].name
或那样写。React 有一个defaultProps属性,允许您设置默认道具。
如果没有 props,则默认情况下数据来自
defaultProps
.反应文档
defaultProps
关于类和功能组件的示例here他们为我的问题 AddPostForm.js 提出了这个解决方案