成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊函數式組件與類組件有何不同

開發 前端
React 中最關鍵的知識點就是組件,在 React 16.8 之前(還沒有 Hooks 前),我們的應用大多寫成 Class 組件,因為 Class 組件有生命周期,能控制狀態(state)。

前言

React 中最關鍵的知識點就是組件,在 React 16.8 之前(還沒有 Hooks 前),我們的應用大多寫成 Class 組件,因為 Class 組件有生命周期,能控制狀態(state)。但函數式組件只能默默站在后面,說自己是木偶組件(也叫無狀態組件),傳來 props,展示UI

以下文字都基于有了 Hooks 后

正文

函數式組件和類組件之間是否有什么根本上的區別?

函數式組件捕獲渲染時的值

具體可以看這篇文章:函數式組件與類組件有何不同?

因為在 React 中 props 是不可變(immutable)的,它們永遠不會改變。然而,this 是可變(mutable)的

事實上,這就是類組件 this 存在的意義。React 本身會隨著時間的推移而改變,以便你可以在渲染方法以及生命周期方法中得到最新的實例

函數式組件會捕獲當前狀態下的值,如果你使用定時器改變當前值的狀態,那函數式組件顯示的還是原來的值,而不是最新值。而類組件會一直獲取最新值

只要一渲染,函數式組件就會捕獲當前的值。而類組件即使渲染了,但是它的 this 會指向最新的實例

類組件

可以看線上Demo

class ClassDemo extends React.Component {
state = {
value: ""
};
showMessage = () => {
alert("最新值為 " + this.state.value);
};
handleMessageChange = (e) => {
this.setState({ value: e.target.value });
};
handleClick = () => {
setTimeout(this.showMessage, 3000);
};
render() {
return (
<div>
<input value={this.state.value} onChange={this.handleMessageChange} />
<button onClick={this.handleClick}>點擊</button>
</div>
);
}
}

這樣的結果是點擊后獲取到最新的值,而不是 3 秒前的值。為什么?因為 this 可變,3 秒之后執行 alert("最新值為 " + this.state.value)。 this.state.value 指向最新的值

如果類組件如果想保存原來的值該怎么做?

一、調用事件之前讀取this.props

可以看線上Demo

showMessage = (value) => {
alert("最新值為 " + value);
};
handleClick = () => {
const { value } = this.state;
setTimeout(() => this.showMessage(value), 3000);
};

可以解決,但點擊時獲取到當前的 user,再傳遞給 this.showMessage,這樣,即使 3 秒之后也是原來的值

缺點:每次都要從 this.props 中拿值,如果數據一多,寫起來不符合人性

二、在構造函數中綁定方法

可以看線上Demo

constructor(props) {
super(props);
this.showMessage = this.showMessage.bind(this);
this.handleClick = this.handleClick.bind(this);
}

這個方法解決不了問題。我們的問題是我們從 this.props 中讀取數據太遲了—— 讀取時已經不是我們所需要使用的上下文

三、利用閉包

把方法寫進 render 中,這樣每次渲染時就能捕獲住當時所用的 props 或者 state

可以看線上Demo

class ClassDemo extends React.Component {
state = {
value: ""
};
render() {
const { value } = this.state;
const showMessage = () => {
alert("最新值為 " + value);
};
const handleMessageChange = (e) => {
this.setState({ value: e.target.value });
};
const handleClick = () => {
setTimeout(showMessage, 3000);
};
return (
<div>
<input value={this.state.value} onChange={handleMessageChange} />
<button onClick={handleClick}>點擊</button>
</div>
);
}
}

但是這個方法很蠢,這個寫法和函數式組件有什么區別呢?還不如用函數式組件呢

函數式組件如果想保存最新的值呢

使用 useRef 保存最新的值,讓組件獲得最新的值

function MyComponent() {
const ref = useRef(null);
}

首先,ref 與實例都扮演同樣的角色,ref 對象是一個有 current 屬性的一個容器

上次的例子我們用函數式組件就可以這樣寫:

const FunctionDemo = () => {
const [value, setValue] = useState("");
const refValue = useRef("");
const showMessage = () => {
alert("最新值為 " + refValue.current);
};
const handleMessageChange = (e) => {
setValue(e.target.value);
refValue.current = e.target.value;
};
const handleClick = () => {
setTimeout(showMessage, 3000);
};
return (
<div>
<input value={value} onChange={handleMessageChange} />
<button onClick={handleClick}>點擊</button>
</div>
);
};

可以看線上Demo

這里筆者提出兩個疑問:

  • 為什么 ref 能保存住最新的值?
  • 為什么函數式組件會捕獲,類組件不會呢?
責任編輯:姜華 來源: 今日頭條
相關推薦

2021-12-02 14:10:34

ChromeChromium瀏覽器

2010-08-06 18:23:43

DB2常用函數

2022-04-26 05:55:06

Vue.js異步組件

2020-09-25 18:10:06

Python 開發編程語言

2023-12-12 11:45:54

云服務數據科學家云計算

2021-07-02 15:28:55

LTE5G網絡

2017-05-31 14:52:53

虛擬機Docker容器

2017-01-13 16:26:56

開發

2018-11-14 22:14:59

2023-04-17 17:56:38

5G

2018-05-31 08:17:53

RAIDNAS重疊

2011-12-21 09:01:28

云計算編程開發

2022-02-25 23:44:44

云計算DRP安全

2012-02-29 09:50:52

云計算虛擬化

2010-07-28 10:09:01

2015-08-10 09:47:24

SDS存儲虛擬化

2020-06-01 13:58:20

機器學習統計建模數據科學

2022-04-06 08:00:00

GitHubGitLab開發

2018-01-05 09:43:54

ROMRAM存儲

2020-09-15 07:00:00

SaaS架構架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品亚洲一区二区 | 亚洲欧美日韩在线不卡 | 国产99精品 | 国产精品免费在线 | 久精品视频 | 亚洲精品福利在线 | 日韩精品免费 | 亚洲欧洲中文 | 四虎永久影院 | 人人性人人性碰国产 | 五月婷婷 六月丁香 | 欧美一区二区三区视频在线 | 少妇久久久 | 日韩欧美亚洲一区 | 成人在线视频网 | 国产精品免费一区二区 | 欧美日韩成人在线 | 国产一极毛片 | 亚洲36d大奶网 | 爱高潮www亚洲精品 中文字幕免费视频 | 秋霞电影院午夜伦 | 亚洲欧洲精品成人久久奇米网 | 婷婷福利 | 婷婷丁香激情 | 天堂av中文 | 国产乱码一二三区精品 | 国产精品免费视频一区 | 99久久久无码国产精品 | 国产美女一区二区 | 日韩国产在线观看 | 欧美综合久久 | 国产黄色av网站 | 亚洲欧美一区二区三区情侣bbw | 国产精品免费一区二区三区四区 | 日韩成人免费中文字幕 | 国产九九九九 | 亚洲精品久久久久久宅男 | 亚洲aⅴ一区二区 | 国产一级特黄真人毛片 | 日日骚视频 | 精品国产一区二区三区久久久四川 |