组件
创建组件的方式
创建组件有函数组件和类组件两种方式,React18 之后,全面使用函数组件,类组件会退出历史舞台。
function Home(props) {
return <div className="home">Welcome to React~</div>;
}
const Home = () => {
return <div className="home">Welcome to React~</div>;
};
对组件的要求
- 组件名称必须以大写字母开头,否则 React 会将以小写字母开头的组件视为原生 DOM 标签
- 必须返回可以渲染的元素
- react 元素
- null
- 组件
- 可迭代的对象,包括数组、Set、Map 等
function App1() {
return null;
}
function App2() {
return [1, 2, 3];
}
// 如果直接返回对象,会报错:Uncaught Error: Objects are not valid as a React child
function App3() {
return { a: 1 };
}
那么是否可以说 React 组件不能返回对象?不能,因为可以返回一个迭代器
const obj = { a: 1 };
obj[Symbol.iterator] = function* () {
for (let prop in obj) {
yield [prop, obj[prop]];
}
};
function App() {
return obj;
}
组件重新渲染的条件
- 自身状态发生变化
- 父组件重新渲染
不可变数据
所有 React 组件都必须像纯函数一样保护它们的props
不被更改
改变数据核心思想:先拷贝这个对象或数组,再改变这个拷贝后的值
更新对象:创建一个新的对象,通常使用展开运算符
const [person, setPerson] = useState({
name: 'Niki de Saint Phalle',
artwork: {
title: 'Blue Nana',
city: 'Hamburg',
image: 'https://i.imgur.com/Sd1AgUOm.jpg'
}
});
如果要更新 person.artwork.city 的值:
setPerson(prevPerson => ({
...prevPerson,
artwork: {
...prevPerson.artwork,
city: 'beijing'
}
}));
更新数组:
- 添加:
setList([...list, 666])
- 删除:通常使用 filter 方法生成一个不包含该元素的新数组