[英]Where should a state be defined?
这两个在React中定义状态的构造之间有什么区别?
class ProductsPage extends Component {
constructor(props) {
super(props);
this.state = {
products: []
};
}
...
}
和这个:
class ProductsPage extends Component {
state = {
products: []
};
...
}
当用ES6编码时,它们都可以很好地工作。 但是,较低的版本似乎不适用于打字稿3。我有以下几点:
interface IState {
products: IProduct[];
}
class ProductsPage extends Component<{}, IState> {
state = {
products: []
};
public componentDidMount() {
this.setState({ products });
}
public render() {
return (
<div className="page-container">
<ul className="product-list">
{this.state.products.map(p => (
<li className="product-list-item" key={p.id}>
{p.name}
</li>
))}
</ul>
</div>
);
}
}
ts编译器标记了一个错误,说:“ never”类型不存在属性ID
这是为什么?
第二种形式是类属性 ,它是第3阶段JavaScript提议(意味着它还不是语言的一部分)。 在构造函数上添加属性是旧的ES2015方法 (称为最大最小类)。
就您而言,没有功能上的差异。
TypeScript要求您声明类字段以确保类型安全-因此发出警告。
如何定义React组件的状态与React本身所倡导的编码风格一样主观。 通常我会走非常严格的路线,如下所示:
type State = {
someStateVar: number[];
};
export class MyComponent extends Component<{}, State> {
public readonly state: State = {
someStateVar: [],
};
public async componentDidMount() {
// Dynamically fetch data (maybe via axios) and populate the new state
const data = await axios.get<number[]>(...);
this.setState({ someStateVar: data });
}
}
如您所见,我确保将state
显式标记为只读,只是要确保没有人尝试直接写入状态(即使如今IDE和linter都可以检查这些错误而无需采取任何预防措施)。
我宁愿不随便手动设置状态的另一个原因是,它可能会鼓励错误地处理状态。 在没有使用setState
情况下,永远不要在类方法中直接为state
赋值。
此外,我基本上是立即定义默认值,并在componentDidMount
中用动态数据填充状态。 这种方法允许您通过删除一个显式的构造函数定义来保持代码简洁,因为无论如何您都应将此类初始化移动到componentDidMount
并且如果您不首先使用类成员箭头表示法,则仅将构造函数用于绑定方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.