最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React組件實(shí)例三大核心屬性State props Refs詳解

 更新時(shí)間:2022年12月01日 09:06:34   作者:花鐺  
組件實(shí)例的三大核心屬性是:State、Props、Refs。類(lèi)組件中這三大屬性都存在。函數(shù)式組件中訪問(wèn)不到 this,也就不存在組件實(shí)例這種說(shuō)法,但由于它的特殊性(函數(shù)可以接收參數(shù)),所以存在Props這種屬性

組件組件實(shí)例的三大核心屬性-State

狀態(tài) state 是組件實(shí)例對(duì)象最重要的屬性之一,它的值是一個(gè)對(duì)象,可以包含多個(gè) key-value 的組合。

當(dāng)組件中的一些數(shù)據(jù)在某些時(shí)刻發(fā)生變化時(shí),就需要使用 state 來(lái)跟蹤狀態(tài)。state 是私有的,并且完全受控于當(dāng)前組件,除了擁有并設(shè)置了它的組件,其他組件都無(wú)法訪問(wèn)。

組件被稱(chēng)為狀態(tài)機(jī),通過(guò)更新組件的 state 來(lái)重新渲染組件,更新對(duì)應(yīng)的頁(yè)面顯示。

this.props 和 this.state 是 React 本身設(shè)置的,且都擁有特殊的含義,但是其實(shí)可以向類(lèi)組件中隨意添加不參與數(shù)據(jù)流的額外字段(比如 this.timerID)。

state 和 props 之間最重要的區(qū)別是:

  • props 由父組件傳入,而 state 由組件本身管理。
  • 組件不能修改 props,但可以修改 state。
class Weather extends React.Component{
	constructor(props) {
	    super(props)
	    // 初始化 state
	    this.state = {
	      isHot: false,
	    }
	}
	// state可以簡(jiǎn)寫(xiě)成如下形式
	// 原因是:類(lèi)中可以直接寫(xiě)賦值語(yǔ)句,實(shí)際上就是直接給實(shí)例對(duì)象上添加屬性
	state = {
		isHot: false,
	}
	componentDidMount() {
	    // 更改 state
	    this.setState({
	        isHot: !this.state.isHot,
	     })
	  }
	 ...
}

State 不可以直接修改

初始化 state 之后,在其他地方不可以直接修改 state,而是應(yīng)該使用 React 內(nèi)置的一個(gè) API:setState() 來(lái)修改。

constructor() 只初始化的時(shí)候調(diào)用一次。

render() 會(huì)調(diào)用 1+n 次,1是初始化,n 是狀態(tài)更新的次數(shù)(也就是說(shuō),每次 setState() 之后, React 都會(huì)調(diào)用一次 render())。

// Wrong,此代碼不會(huì)重新渲染組件
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});

setState() 有兩種寫(xiě)法:

setState(nextState, [callback]):對(duì)象式的 setState。

參數(shù):

  • nextState:將要設(shè)置的新?tīng)顟B(tài),該狀態(tài)會(huì)和當(dāng)前的 state 合并。
  • callback:可選參數(shù),回調(diào)函數(shù)。該函數(shù)會(huì)在狀態(tài)更新完畢,且界面也更新后(render() 后)調(diào)用。
	this.setState({
		count: this.state.count +1,
	}, () => {
		console.log(this.state.count)
	})

setState(updater, [callback]):函數(shù)式的 setState。

參數(shù):

  • updater:是一個(gè)函數(shù),可以接收到 state 和 props 作為參數(shù),返回值為將要設(shè)置的新?tīng)顟B(tài)。
  • callback:可選參數(shù),回調(diào)函數(shù)。該函數(shù)會(huì)在狀態(tài)更新完畢,且界面也更新后(render() 后)調(diào)用。
	this.setState((state, props) => ({
		count: state.count +1,
	}), () => {
		console.log(this.state.count)
	})

對(duì)象式的 setState 是函數(shù)式的 setState 的簡(jiǎn)寫(xiě)方式(語(yǔ)法糖)。這兩種寫(xiě)法的使用原則:

如果新?tīng)顟B(tài)不依賴(lài)于原狀態(tài),使用對(duì)象方式;如果新?tīng)顟B(tài)依賴(lài)于原狀態(tài),使用函數(shù)方式。如果需要在 setState() 執(zhí)行后獲取最新的狀態(tài)數(shù)據(jù),要在第二個(gè)參數(shù) callback 函數(shù)中讀取。

State 的更新是合并

setState() 的更新是合并,不是替換。

constructor(props) {
    super(props);
    // state 包含幾個(gè)獨(dú)立的變量
    this.state = {
      isHot: false,
       wind: '微風(fēng)',
    }
  }
componentDidMount() {
    // 此處調(diào)用 setState() 更新了 isHot 的值,但是 wind 的值也并沒(méi)有丟失,所以說(shuō)明更新的這個(gè)動(dòng)作是合并
    this.setState({
        isHot: !this.state.isHot,
     })
  }

State 的更新可能是異步的

出于性能考慮,React 可能會(huì)把多個(gè) setState() 調(diào)用合并成一個(gè)調(diào)用。

因?yàn)?this.props 和 this.state 可能會(huì)異步更新,所以不要依賴(lài)他們的值來(lái)更新下一個(gè)狀態(tài)。要解決這個(gè)問(wèn)題,可以讓 setState() 接收一個(gè)函數(shù)而不是一個(gè)對(duì)象。

// Wrong
this.setState({
  count: this.state.count + 1,
})
console.log(this.state.counter) //此時(shí)直接讀取獲取到的仍然是舊的 count 值
// Correct
this.setState({
  count: this.state.count + 1,
}, () => {
	console.log(this.state.counter) //此時(shí)讀取獲取到的是新的 count 值
})

組件實(shí)例對(duì)象的三大核心屬性-Props

當(dāng) React 元素為用戶(hù)的自定義組件時(shí),它會(huì)將所接收的標(biāo)簽屬性及子組件轉(zhuǎn)換為單個(gè)對(duì)象傳遞給組件,這個(gè)對(duì)象被稱(chēng)之為 “props”。

props 是 React 組件的輸入。它們是組件外部向組件內(nèi)部傳遞變化的數(shù)據(jù)。

props 是只讀的,組件無(wú)論是使用函數(shù)組件還是類(lèi)組件,都決不能修改自身的 props。

// 類(lèi)組件
class Person extends React.Component{
	render(){
		const {name, age, sex} = this.props
		return (
			<ul>
				<li>姓名:{name}</li>
				<li>性別:{sex}</li>
				<li>年齡:{age+1}</li>
			</ul>
		)
	}
}
// 函數(shù)式組件
function Person(props){
	const {name, age, sex} = props
	return (
		<ul>
			<li>姓名:{name}</li>
			<li>性別:{sex}</li>
			<li>年齡:{age+1}</li>
		</ul>
	)
}
ReactDOM.render(<Person name="jerry" age={19}  sex="男"/>, document.getElementById('test'))
// 批量傳遞 props 的簡(jiǎn)寫(xiě)方法(或者叫批量傳遞標(biāo)簽屬性):
// 原生 JS 中擴(kuò)展運(yùn)算符是不能展開(kāi)對(duì)象的。
// 由于 React 和 Babel 的原因,擴(kuò)展運(yùn)算符可以展開(kāi)對(duì)象,但僅僅適用于標(biāo)簽屬性的傳遞,別的地方不支持。
ReactDOM.render(<Person {...{
	name: 'jerry',
	age: 19,
	sex: '男'
}} />, document.getElementById('test'))

props.children

每個(gè)組件都可以獲取到 props.children,它包含組件的開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽之間的內(nèi)容。

<Welcome>Hello world!</Welcome>
// 不寫(xiě)標(biāo)簽體,寫(xiě)成 children 標(biāo)簽屬性也可以
<Welcome children='Hello world!'></Welcome>
// 在 Welcome 組件中獲取 props.children,就可以得到字符串 Hello world!
function Welcome(props) {
  return <p>{props.children}</p>;
}

使用defaultProps設(shè)置默認(rèn)的prop值

可以通過(guò)配置特定的 defaultProps 屬性來(lái)定義 props 的默認(rèn)值。

// 給組件加上 defaultProps 的屬性
Person.defaultProps = {
  title: '我是詳情'
}
// 簡(jiǎn)寫(xiě):簡(jiǎn)寫(xiě)的這種方式只適用于類(lèi)組件,因?yàn)楹瘮?shù)式組件中是沒(méi)有 static 的
class Person extends React.Component{
	static defaultProps = {
	  title: '我是詳情'
	}
}

使用propTypes進(jìn)行類(lèi)型檢查

PropTypes 提供一系列驗(yàn)證器,可用于確保組件接收到的數(shù)據(jù)類(lèi)型是有效的。當(dāng)傳入的 prop 值類(lèi)型不正確時(shí),JavaScript 控制臺(tái)將會(huì)顯示警告。

propTypes 類(lèi)型檢查發(fā)生在 defaultProps 賦值后,所以類(lèi)型檢查也適用于 defaultProps。

出于性能方面的考慮,propTypes 僅在開(kāi)發(fā)模式下進(jìn)行檢查。

// 只要給組件加上 propTypes 屬性,React 就會(huì)認(rèn)為是在加規(guī)則
Person.propTypes = {
  // React.PropTypes 是 React 內(nèi)置的屬性
  title: React.PropTypes.string.isRequired, // 錯(cuò)誤
   // 自 React v15.5 起,React.PropTypes 已移入另一個(gè)包中,需要的話要使用`import PropTypes from 'prop-types'`引入,引入之后全局就會(huì)有了一個(gè)對(duì)象 PropTypes
    title: PropTypes.string.isRequired, // 正確
    speak: PropTypes.func,
}
/// 簡(jiǎn)寫(xiě):簡(jiǎn)寫(xiě)的這種方式只適用于類(lèi)組件,因?yàn)楹瘮?shù)式組件中是沒(méi)有 static 的
class Person extends React.Component{
	static propTypes = {
	  title: PropTypes.string.isRequired, 
	}
}

組件實(shí)例對(duì)象的三大核心屬性-Refs

PS:勿過(guò)度使用 Refs

組件內(nèi)的標(biāo)簽可以定義 ref 屬性來(lái)標(biāo)識(shí)自己,都會(huì)被收集到組件實(shí)例對(duì)象的 refs 屬性下,這樣,通過(guò) this.refs.ref屬性 就可以訪問(wèn)到 ref 當(dāng)前所處的真實(shí)節(jié)點(diǎn)。

無(wú)法在函數(shù)式組件上使用 ref 屬性。

Ant Design 中很多組件都獲取不到 ref,可以包裹或內(nèi)嵌一層自己創(chuàng)建的元素以獲取 ref。

字符串形式的Ref

React 不推薦使用字符串形式的 ref,它已過(guò)時(shí)并可能會(huì)在未來(lái)的版本中被移除,這種方式存在一些效率上的問(wèn)題。

class Demo extends React.Component {
  showData = () => {
     console.log(this) // 打印可以看到組件的實(shí)例對(duì)象上 this 有 refs 屬性,屬性值是 key-value 的對(duì)象 ,其中有一個(gè)key 就是 input1,value 是 ref 當(dāng)前所處的真實(shí)節(jié)點(diǎn)。
	// 訪問(wèn) refs
     alert(this.res.input1.value)
  }
  render() {
    return (
    	<div>
    	    // 創(chuàng)建、綁定 refs
    		<input ref="input1" />
    		<button onClick={this.showData}>點(diǎn)擊</button>
    	</div>
    )
  }
}

回調(diào)函數(shù)形式的Ref

如果 ref 回調(diào)函數(shù)是以?xún)?nèi)聯(lián)函數(shù)的方式定義的,在更新過(guò)程中它會(huì)被執(zhí)行兩次,第一次傳入?yún)?shù) null,第二次才會(huì)傳入 DOM 元素。這是因?yàn)樵诿看?render 渲染時(shí)都會(huì)創(chuàng)建一個(gè)新的函數(shù)實(shí)例,所以 React 會(huì)首先清空舊的 ref,然后才會(huì)設(shè)置新的。這個(gè)問(wèn)題大多數(shù)情況下是無(wú)關(guān)緊要的。

初次渲染時(shí)不會(huì),因?yàn)槌醮武秩緯r(shí)沒(méi)有舊的 ref 需要去清空。

class Demo extends React.Component {
  showData = () => {
	// 訪問(wèn) refs
     alert(this.input1.value)
  }
  render() {
    return (
    	<div>
    	    // 創(chuàng)建、綁定 refs
    	    // render 方法執(zhí)行的時(shí)候會(huì)自動(dòng)調(diào)用 ref 的回調(diào)函數(shù),并且會(huì)把當(dāng)前所處的真實(shí)節(jié)點(diǎn)作為參數(shù)傳遞進(jìn)去,然后將這個(gè)節(jié)點(diǎn)賦值給組件實(shí)例自身的一個(gè)自定義屬性上
    		<input ref={c => this.input1 = c} />    
    		<button onClick={this.showData}>點(diǎn)擊</button>
    	</div>
    )
  }
}

通過(guò)將 ref 的回調(diào)函數(shù)定義成類(lèi)的綁定函數(shù)的方式可以避免上述問(wèn)題。

class Demo extends React.Component {
 setInputRef = (c) => {
 	// 綁定 refs
 	this.input1 = c
 }
  showData = () => {
	// 訪問(wèn) refs
     alert(this.input1.value)
  }
  render() {
    return (
    	<div>
    	    // 創(chuàng)建 refs
    	    // 更新時(shí)也不會(huì)重復(fù)觸發(fā) setInputRef,因?yàn)樗呀?jīng)放在實(shí)例自身了
    		<input ref={this.setInputRef} />    
    		<button onClick={this.showData}>點(diǎn)擊</button>
    	</div>
    )
  }
}

createRef

React.createRef() 是 React 內(nèi)置的一個(gè) API,調(diào)用后可以返回一個(gè)容器,該容器存儲(chǔ)被 ref 所標(biāo)識(shí)的節(jié)點(diǎn)。該容器是專(zhuān)人專(zhuān)用的。

class Demo extends React.Component {
   // 創(chuàng)建 refs
  myRef = React.createRef()
  showData = () => {
  	// 訪問(wèn) refs
     alert(this.myRef.current.value)
  }
   render() {
     return (
    	<div>
    	    // 綁定 refs
    	    // 下面一行代碼在執(zhí)行的時(shí)候,React 發(fā)現(xiàn)了 ref 屬性,并且發(fā)現(xiàn)屬性值是用 createRef 創(chuàng)建出來(lái)的一個(gè)容器,這時(shí), React 會(huì)把當(dāng)前 ref 所在的那個(gè)節(jié)點(diǎn)直接存儲(chǔ)到那個(gè)容器里面
    		<input ref={this.myRef} />    
    		<button onClick={this.showData}>點(diǎn)擊</button>
    	</div>
    )
  }
}

訪問(wèn)Refs

當(dāng) ref 被傳遞給 render 中的元素時(shí),對(duì)該節(jié)點(diǎn)的引用可以在 ref 的 current 屬性中被訪問(wèn)。

ref 的值根據(jù)節(jié)點(diǎn)

Refs 轉(zhuǎn)發(fā)

Refs 轉(zhuǎn)發(fā)是一個(gè)可選特性,其允許某些組件接收 ref,并將其向下傳遞給子組件。

ref 轉(zhuǎn)發(fā)不僅限于 DOM 組件,也可以轉(zhuǎn)發(fā) refs 到 class 組件實(shí)例。

const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));

FancyButton 使用 React.forwardRef 來(lái)獲取傳遞給它的 ref,然后轉(zhuǎn)發(fā)到它渲染的 DOM button。這樣,使用 FancyButton 的組件可以獲取底層 DOM 節(jié)點(diǎn) button 的 ref ,并在必要時(shí)訪問(wèn),就像其直接使用 DOM button 一樣。

上述代碼的執(zhí)行步驟如下:

  • 通過(guò)調(diào)用 React.createRef 創(chuàng)建了一個(gè) React ref 并將其賦值給 ref 變量;
  • 通過(guò)指定 ref 為 JSX 屬性,將其向下傳遞給 <FancyButton ref={ref}>
  • React 傳遞 ref 給 forwardRef 內(nèi)函數(shù) (props, ref) => ...,作為其第二個(gè)參數(shù);
  • 向下轉(zhuǎn)發(fā)該 ref 參數(shù)到 <button ref={ref}>,將其指定為 JSX 屬性;
  • 當(dāng) ref 掛載完成,ref.current 將指向 <button> DOM 節(jié)點(diǎn);

到此這篇關(guān)于React組件實(shí)例三大核心屬性State props Refs詳解的文章就介紹到這了,更多相關(guān)React組件state props refs內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決React Native端口號(hào)修改的方法

    解決React Native端口號(hào)修改的方法

    這篇文章主要介紹了解決React Native端口號(hào)修改的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • React 組件中實(shí)現(xiàn)事件代理

    React 組件中實(shí)現(xiàn)事件代理

    React的事件系統(tǒng)和瀏覽器事件系統(tǒng)相比,主要增加了兩個(gè)特性:事件代理、和事件自動(dòng)綁定,本文主要介紹了React 組件中實(shí)現(xiàn)事件代理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • React常見(jiàn)的?HOC?使用案例及示例代碼

    React常見(jiàn)的?HOC?使用案例及示例代碼

    高階組件(Higher-Order?Component,HOC)是一種用于在?React?中復(fù)用組件邏輯的技術(shù),這篇文章主要介紹了React常見(jiàn)的?HOC?使用案例示例代碼,需要的朋友可以參考下
    2024-08-08
  • 淺談react.js中實(shí)現(xiàn)tab吸頂效果的問(wèn)題

    淺談react.js中實(shí)現(xiàn)tab吸頂效果的問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談react.js中實(shí)現(xiàn)tab吸頂效果的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式

    React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式

    這篇文章主要介紹了React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 記錄React使用connect后,ref.current為null問(wèn)題及解決

    記錄React使用connect后,ref.current為null問(wèn)題及解決

    記錄React使用connect后,ref.current為null問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺談react新舊生命周期鉤子

    淺談react新舊生命周期鉤子

    所謂的生命周期就是指某個(gè)事物從開(kāi)始到結(jié)束的各個(gè)階段,本文主要介紹了淺談react新舊生命周期鉤子,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 手動(dòng)用webpack搭建第一個(gè)ReactApp的示例

    手動(dòng)用webpack搭建第一個(gè)ReactApp的示例

    本篇文章主要介紹了手動(dòng)用webpack搭第一個(gè) ReactApp的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 淺談React組件之性能優(yōu)化

    淺談React組件之性能優(yōu)化

    這篇文章主要介紹了淺談React組件之性能優(yōu)化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • React組件渲染后對(duì)DOM的操作方式

    React組件渲染后對(duì)DOM的操作方式

    這篇文章主要介紹了React組件渲染后對(duì)DOM的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

大竹县| 德化县| 甘德县| 英超| 横山县| 平南县| 内乡县| 景宁| 庆阳市| 平阳县| 腾冲县| 桐乡市| 潢川县| 岱山县| 克拉玛依市| 桃江县| 濮阳市| 抚远县| 滕州市| 临朐县| 吉木萨尔县| 陇南市| 乌鲁木齐县| 陈巴尔虎旗| 淮南市| 崇明县| 荥经县| 东至县| 通化市| 新和县| 平潭县| 高安市| 友谊县| 平度市| 东丽区| 双城市| 万宁市| 吴江市| 太白县| 南康市| 曲麻莱县|