❤React体系08-函数组件的useState的认识和使用
1、useState认识 (函数组件hooks)
(1)新建组件
根目录下面新建demo文件夹=>下面新建01-userState.js文件
userState.js 文件夹里面写一个简单的函数,然后进行导出,在这里我们采用的都是ES6的语法:
function Counter() {
return (
<div>
我是count
</div>
);
}
export default Counter;
(2)引入
接下来我们在App.js之中进行引入
import Counter from './demo/01-userState.js'
function App() {
return (
<div className="App">
<header className="App-header">
<Counter></Counter>
</header>
</div>
);
}
export default App;
运行项目,我们的组件已经正确的显示到了网页上。
(3)利用useState编写一个简单的计数器
function Counter() {
// 使用 useState 创建一个名为 count 的状态变量,初始值为 0
// setCount 是用来更新 count 状态的函数
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
{/* 点击按钮时调用 setCount 来更新 count 状态 */}
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
点击按钮,计数器可以正常使用
(4)利用useState编写一个输入框
function Counter() {
const [text, setText] = useState('hello');
function handleChange(e) {
setText(e.target.value);
}
// 使用 useState 创建一个名为 count 的状态变量,初始值为 0
// setCount 是用来更新 count 状态的函数
const [count, setCount] = useState(0);
return (
<>
<input value={text} onChange={handleChange} />
<p>You typed: {text}</p>
<button onClick={() => setText('hello')}>
Reset
</button>
</>
);
}
(5)利用useState编写一个选择框
思路分析:同理也是跟我们写input文本框差不多,写一个input。类型为checkbox,然后利用 useState编写一个初始状态,最后利用onChange实践改变input的值,重新渲染useState的值
// 复选框
const [liked, setLiked] = useState(true);
function handleChange(e) {
setLiked(e.target.checked);
}
return (
<>
<label>
<input
type="checkbox"
checked={liked}
onChange={handleChange}
/>
I liked this
</label>
<p>You {liked ? 'liked' : 'did not like'} this.</p>
</>
);
(6) useState根据之前的状态更新状态
接下来我们在一个函数之中调用三次添加,(42+3=45)结却跟我们想的不一样
import React, { useState } from 'react';
function Counter() {
const [age, setAge] = useState(42);
function handleClick() {
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
}
return (
<>
<div>
年龄大小:{age}
</div>
<button onClick={handleClick}>
You pressed me {age} times
</button>
</>
);
}
export default Counter;
更改方式
function handleClick() {
setAge(a => a + 1); // setAge(42 => 43)
setAge(a => a + 1); // setAge(42 => 43)
setAge(a => a + 1); // setAge(42 => 43)
}
(6)复杂变量的修改(更新状态中的对象和数组)
React 中状态被认为是只读的,我们更改替换它而不是改变现有的对象。
例如,如果你有一个状态为 form
的对象,不要改变它
官方给我们的案例是这样子的:
// 🚩 Don't mutate an object in state like this:
form.firstName = 'Taylor';
// ✅ Replace state with a new object
setForm({
...form,
firstName: 'Taylor'
});
(6)异步操作获取更新的值
在类组件里面,修改值时异步操作可以拿到更新后的值,但是在函数组件,异步获取是拿不到更新后的值的
function App() {
const [count, setCount] = useState(0)
const handleClick = () => {
setCount(count => count + 1)
console.log("value1: ", count)
setTimeout(() => {
console.log("value2: ", count)
})
}
return (
<div>
<h4>count: {count}</h4>
<button onClick={handleClick}>点击更新状态</button>
</div>
)
}
function Counter() {
const [count, setCount] = useState(0)
const handleClick = () => {
setCount(count => count + 1)
console.log("value1: ", count)
setTimeout(() => {
console.log("value2: ", count)
})
}
return (
<div>
<h4>count: {count}</h4>
<button onClick={handleClick}>点击更新状态</button>
</div>
)
}
我们写一个计算组件:
点击以后输出:
在函数组件中是不能通过异步来获取更新的值,我们可以通过 useRef
来获取,更改我们的代码
const countRef = useRef(count)
countRef.current = count
const handleClick = () => {
setCount(count => count + 1)
console.log("value1: ", countRef.current)
setTimeout(() => {
console.log("value2: ", countRef.current)
})
}
ok! 异步获取状态成功!