今日文章目录
- 前言
- 参考文章
之前提到,useState
方法可以让我在component
内部操作资料状态。
今天来谈谈另外一个常用到的方法:useEffect
。
这里的Effect
指的是「side-effect 副作用」。
也就是说 useEffect
是用来处理React component
职责以外的额外动作。
(举手提问) React component的职责是什麽?
答:在使用者介面上直接操作资料状态及回传节点。
就是之前说的:实现 相关UI与逻辑 群组化(component
),并回传React element(JSX
)。
(补充後面动作:节点透过ReactDOM.render()
放入html档,浏览器解析成 DOM tree,然後渲染成网页画面。)
额外动作好比:call api拿资料,直接操作原始DOM(不经过React component
),登入 token...等,不是component
的主要职责,但需要执行的动作,都可能使用到 useEffect
。
useEffect(function,[state1, props2...])
useEffect()
接收两个参数:
function
: 执行动作的函式。useEffect()
会写在component
里面,所以函式内也可以操作state
[state1, props2...]
: 用来比对state
或props
状态,如果状态有变,执行function
,比对项目如果有多组,只要一个有变,function
就会执行。这里要提到两个重要概念:React render 顺序、dependency比对标准
component
、useEffect()
内、JSX
内。可以看到component
会先屡行它的主要职责,才进行额外行动:useEffect是在component渲染完後才执行。
[dependency]
,程序执行的情况。OK,那如果dependency要比对物件型别呢?
useEffect(() => console.log("useEffect !"),[{id: 1, name: "Joanna"}])
这会出现一个状况:如果物件内的属性改值,但 useEffect()
比对物件的位址不变,导致不会执行动作。
如果要解决这样的问题,有几个解决方法:
const [obj, setObj] = useState({id: 1, name: "Joanna"});
useEffect(() => console.log("useEffect !"),[obj.name])
useEffect()
比对物件的位址,那我改位址可以吧!const [obj, setObj] = useState({id: 1, name: "Joanna"});
useEffect(() => console.log("useEffect !"),[obj])
// 改值:
setObj({...obj, name: "David"})
>>: Day13:13 - 购物车服务(1) - 後端 - 购物车总商品显示、加入购物车API
前面四篇讲的 slice 基础都是当天看当天吸收,消化过後出在铁人赛的文章上。这样安排非常紧凑的,但...
总结: 一切都是文件 在Linux里所有元素的操作(包括硬件)都是以文件表示. 统一的操作介面让程序...
正规表达式(Regular Expression) 一个范本的字串,在范本字串的每一个字元都有特殊意...
Menu 这个套件应用的范围很广,之前讲解过的 Select 也是用这里的 MenuItem 来替换...
当我们有时候某个功能的重复运用性较高,但每次都还要再写一个一模一样的功能,是不是很麻烦呢? 那麽这时...