静态组件
函数组件是静态组件
如何理解?
让我们先来试试这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| const Vote = function Vote(props) { let { title } = props; let supNum = 10, oppNum = 5;
return <div className="vote-box"> <div className="header"> <h2 className="title">{title}</h2> <span>{supNum + oppNum}人</span> </div> <div className="main"> <p>支持人数:{supNum}人</p> <p>反对人数:{oppNum}人</p> </div> <div className="footer"> <button onClick={() => { supNum++; console.log(supNum); }}>支持</button>
<button onClick={() => {//合成事件中后序学习 oppNum++; console.log(oppNum); }}>反对</button> </div> </div>; }; export default Vote;
|
调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import React from 'react'; import ReactDOM from 'react-dom/client'; import Vote from './component/Vote';
const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <> <Vote title="React其实还是很好学的!" /> </> );
setTimeout(() => { root.render( <> <Vote title="我是五秒后传递的标题" /> </> ); }, 5000);
|
可以见到,视图是渲染出来了,但点击按钮只能后台打印,与我们所设计的点击按钮后还渲染视图不符。
静态组件的特点
让我们先看看函数组件渲染的过程:
- 第一次渲染组件,把函数执行
- 产生一个私有的上下文:EC(V)(随便取的名字指大函数)
- 把解析出来的props(含children)传递进来(会被冻结)。
- 对函数返回的JSX元素(virtualDOM)进行渲染
- 当我们点击按钮的时候,会把被绑定函数执行:
- 修改上级上下文EC(V)中的变量
- 私有变量值发生了改变
- 但是“视图不会更新”
- 也就是,函数组件第一次渲染完毕后,组件中的内容,不会根据组件内的某些操作,再进行更新,所以称它为静态组件
- 除非在父组件中,重新调用这个函数组件(可以传递不同的属性信息)
总结一下:
- 不具备状态、生命周期函数、ref等内容(后续会讲到)
- 第一次渲染完毕,除非父组件控制其重新渲染,否则内容不会再更新
- 优势:渲染速度快
- 弊端:静态组件,无法实现组件动态更新
一个简单的例子
1 2 3 4 5 6 7 8 9 10 11 12 13
| import React from "react"; const FunctionComponent = function FunctionComponent() { let num = 0; return <div> {num} <br /> <button onClick={() => { num++; console.log(num); //变量值累加,但是组件不会重新渲染 }}>增加</button> </div>; }; export default FunctionComponent;
|
解决办法
大部分需求,都需要在第一次渲染完毕后,基于组件内部的某些操作,让组件可以更新,以此呈现出不同的效果:
动态组件
方法:类组件、Hooks组件(在函数组件中,使用Hooks函数)
敬请期待——