受控组件、非受控组件、无状态组件、纯函数的理解


受控组件

何为受控组件?

当组件的state状态改变时,会自动修改表单的状态,或者表单的状态被改变时,通过setState修改组件的状态,这样就形成了组件对表单控件的控制,其实就是表单控件的状态和组件的state状态是一致的,这就表示了他是一个受控组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 受控组件
export const Test = () => {
const [val, setVal] = useState();

const handleChange = (e) => {
setVal(e.nativeEvent.target.value)
}
return (
<div className={styles.container}>
<p>当前的值:{val}</p>
<input value={val} onChange={handleChange} />
</div>
)
}
// 我们可以看到输入框里的值和p标签的值,始终保持一致

非受控组件

反之非受控组件表示不被state或组件同步地去控制,他们更多只是做了一个初始化的操作,如下

1
2
3
4
5
6
7
8
9
10
11
export const Test = () => {
const [val] = useState("我只有一个初始值");

return (
<div className={styles.container}>
<p>当前的值:{val}</p>
<input defaultValue={val} />
</div>
)
}
// 在输入框里输入内容,p标签的值并不会变化

函数式组件/无状态组件

函数式组件/无状态组件:即_用函数返回一个组件,其实就是函数返回了html,因为他是在函数里的,所以没有办法去定义state,也没有生命周期,但是可以接受外部传进来的props,所以一般作为纯展示组件使用,和有状态组件相比,他有不错的性能。

1
2
3
function Test(props) {
return <div>hello world</div>
}

但是有了hooks之后,可以在函数式组件里使用state

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React, { useState, useEffect } from 'react';

function Test() {
const [val, setVal] = useState("123");
return (
<div>
<p>当前值:{val}</p>
<button
onClick={
() => {
setVal("456")
}
}>
<button>
</div>
)
}

useState返回的setState是不具备类组件setState合并多个state的能力,所以如果state中有多个state,在更新时,其他值一定要一起更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Test() {
const [info, setInfo] = useState({name:"pear",sex:"man"});
return (
<div>
<p>我是:{info.name},性别为:{info.sex}</p>
<button
onClick={
() => {
setInfo({
...info,
name: "apple"
})
}
}>
<button>
</div>
)
}

纯函数

  1. 函数的执行过程中无任何副作用,如:网络请求、dom操作、定时器等
  2. 如果函数的调用参数相同,则永远返回相同的结果(对于同一参数,返回同一结果)。他不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖其输入的参数,再简单的说,纯函数的返回结果只依赖于他的参数,执行一个纯函数你不用担心它会干什么坏事,它不会产生不可预料的行为,也不会对外部产生影响
1
2
3
4
let num1 = 1;
const fun = (num) => num1 + num;
fun(10) // 结果11
// 这就不是一个纯函数,首先他依赖了外部的num1,如果我们不知道num1的值,我们是不知道返回的结果的
1
2
3
const fun = (x, y) => x + y;
fun(1,2) // 结果3
// 他就是一个纯函数,因为他满足了,函数的返回依赖传入的参数,并且我们明确知道传入的值是多少,而且他没有依赖任何外部的值

我的微信公众号: 梨的前端小屋


  目录