教程:FullStackOpen/Part 1 - React 入门

App:Codepen/anecdote/fullstackopen2021: 1.12-1.14


1. Using the State Hook

通过 React 的 state hook 向应用的 App 组件中添加状态。

import React, { useState } from "react";

const App = () => {
	...
	const [selected, setSelected] = useState(0);
	...
};

函数调用将 state 添加到组件,并将其值用0进行初始化。 该函数返回一个包含两个元素的数组。 selected 变量被赋予的初始值 state 为零。 变量 setSelected 被分配给一个函数,该函数将用于修改 state。

2. Function That Returns A Function

事件处理程序(Event Handler)应该是一个函数或一个函数引用,不能是对函数的调用。

const App = () => {
	...
	const getAnecdote = () => setSelected(Math.floor(Math.random() * anecdotes.length));
	...
	return (
		...
		<Button onClick={getAnecdote} text="next anecdote" />
		...
	);
};

onClick 属性的值是一个包含函数引用的变量。

2. Do Not Mutate State Directly

React 中 state 不可直接修改。

直接修改会导致意想不到的副作用。 必须始终通过将状态设置为新对象来更改状态。 如果之前的状态没有变化,属性仅仅需要简单地复制,就是通过将这些属性复制到新的对象中,并将其设置为新状态。

3. Handling Arrays

基于 React 中 state 不可直接修改的原则,向状态数组中添加新元素应通过 concat 方法完成而非 pushconcat 不改变现有数组,而是返回数组的新副本,并将元素添加到该数组中;push 将新元素添加到原数组中。

在 anecdote 中使用状态数组:

const App = () => {
	...
	const [votes, setVotes] = useState(Array(anecdotes.length).fill(0));
	const voteAnecdote = (selected) => () => {
		const copy = [...votes];
		copy[selected] += 1;
		setVotes([...copy]);
	};
			...
	return (
		...
		<Button onClick={voteAnecdote(selected)} text="vote" />
		...
	);
};