React組件的使用詳細(xì)講解
1.組件的創(chuàng)建方式
函數(shù)式組件
特別注意這里的寫法,如果要在 JSX 里寫 js 表達(dá)式(只能是表達(dá)式,不能是流程 控制語句),就需要加 {},包括注釋也是一樣,并且可以多層嵌套
// 函數(shù)式組件
// 寫組件模板的時候必須遵循jsx語法
function App() {
return (
<div className="App">
hello reactjs
</div>
);
}class組件
ES6 的加入讓 JavaScript 直接支持使用 class 來定義一個類,react 的第二種創(chuàng)建組件 的方式就是使用的類的繼承,ES6 class 是目前官方推薦的使用方式,它使用了 ES6 標(biāo)準(zhǔn) 語法來構(gòu)建
// class組件
// 注意:組件名必須首字母大寫(為了和普通標(biāo)識符區(qū)分開),必須繼承自 React.Component 組件
// class的好處就是可以在render并列的位置
// class組件中,使用的this是當(dāng)前組件實例
// App這個組件必須繼承自React.Component
class App extends React.Component {
// App這個組件要想渲染什么由內(nèi)部的render方法決定,必須要有render方法,這個render方法負(fù)責(zé)渲染組件的模板就是有什么標(biāo)簽
// js中如果return后面沒有語句就會自動加分號
// 當(dāng)想要使用插件時得改變 組件文件名的后綴改為jsx
// 定義組件狀態(tài)state,組件數(shù)據(jù)
// 在constructor函數(shù)中對組件狀態(tài)進(jìn)行初始化
constructor(props) {
super(props)
this.state = {//初始化組件狀態(tài)
count: 100,
arr: ['nodejs', 'react', 'vue.js']
}
}
// state = 100
// state = {
// count: 100,
// arr: ['nodejs', 'react', 'vue.js']
// }
render() {//render中必須return返回 組件模板
return (
<div className="App">
<h1>{this.state.count}</h1>
<h1>{this.state.arr}</h1>
</div>
);
}
}2.組件命名規(guī)范
組件名稱必須以大寫字母開頭。
<Welcome name="james">
小駝峰命名來定義屬性
<Welcome className="blue" tabIndex="1" >
3.組件傳值props
函數(shù)組件通過參數(shù) props 接收外部組件傳入的數(shù)據(jù), 在組件內(nèi)根據(jù) props 處理 UI
傳遞值:
<Header id="1001" url="http://xxx.com"></Header>
接收值(函數(shù)式組件)
函數(shù)式組件用參數(shù) props 接收值
function Header ( props ){
return (
<div className="header">
{/* 組件模板中使用 組件的屬性 */}
<h1>{props.id},{props.url}</h1>
</div>
)
}
類組件中處理props
類組件通過this.props接收外部組件傳入的數(shù)據(jù),在組件內(nèi)根據(jù)this.props處理UI
接收值(class組件)
class 組件內(nèi)部用 this.props 接收值
class Header extends React.Component{
render(){
return (
<div className="header">
{/* 組件模板中使用 組件的屬性 */}
<h1>{this.props.id},{this.props.url}</h1>
</div>
)
}
}子組件:
import React, { Component } from 'react';
class Child extends Component {
handleClick() {
// this.props.title = 'state'; //props是只讀的.
}
render() {
return (
<div className="child">
{this.props.title}{this.props.count}
<button onClick={() => { this.handleClick() }}>更改</button>
</div>
);
}
}
export default Child;父組件中
<Child title="今天學(xué)習(xí)props" count={100} />
注意:
<></> 原名是<Fragment>可以省略,充當(dāng)?shù)氖且粋€包裹元素(包裹其他標(biāo)簽), 最終在頁面中不會渲染.
4.組件樣式sass
在react組件中,使用sass編寫組件樣式,需要依賴sass插件。
使用步驟:
下載插件
npm i sass -D
創(chuàng)建.scss文件,編寫sass代碼
在組件中引入scss文件
import './App.scss';
5.組件的生命周期函數(shù)
主文件
import './App.css';
import Child from './Child';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件 ( 主要使用這個 )
//使用 rsf 快速創(chuàng)建 函數(shù)式組件
import React, { Component } from 'react';
class App extends Component {
// 掛載期(掛載期的方法會自動執(zhí)行,而且只執(zhí)行一次)
constructor(props) {//這個函數(shù)會在組件掛載前就執(zhí)行,組件并沒有顯示在頁面上
super(props);
console.log('constructor');
this.state = {}//初始化組件狀態(tài)
}
componentWillMount() {//掛載前
console.log('componentWillMount 將要掛載');
}
componentDidMount() {//掛載完成,組件就會顯示在頁面上
console.log('componentDidMount 掛載完成');
// 在這里發(fā)送網(wǎng)絡(luò)請求,創(chuàng)建定時器,事件監(jiān)聽,理由是:這個方法只執(zhí)行一次,而且會自動執(zhí)行
// 這里的this指的是組件實例this.timerid就是將定時器保存在當(dāng)前組件實例身上,就可以在各個組件生命周期共享
// 還可以直接保存在組件狀態(tài)中,只不過保存在組件狀態(tài)中定時器是可以改變的,如果不變化就可以保存在組件實例身上
this.timerid = setInterval(() => {
console.log('定時器在執(zhí)行');
}, 1000)
}
// 更新期(更新期的方法可能會反復(fù)調(diào)用執(zhí)行)
// 性能優(yōu)化時寫的地方
shouldComponentUpdate(nextProps, nextState) {//控制組件是否更新,目的是提示組件性能(性能優(yōu)化)
// 組件性能優(yōu)化:把有效的更新進(jìn)行更新,無效的更新就不讓它進(jìn)行更新
// 組件狀態(tài)是否有變化,如果有變化就更新,沒有變化就不更新
// 當(dāng)setState中的數(shù)據(jù)和state中的數(shù)據(jù)相等沒有必要更新
// if (this.state == nextState) {
// 滿足條件就不更新,傳進(jìn)來的state是兩個對象,當(dāng)每次更新的時候?qū)ο笏傅牡刂范际遣灰粯拥?,所以不能直接比較,要將對象轉(zhuǎn)換為字符串進(jìn)行比較
if (JSON.stringify(this.state) == JSON.stringify(nextState)) {
return false;
} else {
return true;//返回false 表示放棄更新,返回true 表示繼續(xù)更新
}
}
componentWillReceiveProps(nextProps) {//Props更新,才會執(zhí)行(可以用這個函數(shù)來監(jiān)聽Props的變化)
// nextProps 是最新的數(shù)據(jù)的對象
// 用這個函數(shù)監(jiān)聽父組件傳來的數(shù)據(jù)是否有變化
console.log('componentWillReceiveProps 將要更新');
}
componentWillUpdate() {
console.log('componentWillUpdate 將要更新');
}
componentDidUpdate() {
console.log('componentDidUpdate 更新完成');
}
// 卸載期
componentWillUnmount() {
console.log('componentWillUnmount 將要卸載');
// 在這里釋放所占用的資源(網(wǎng)路請求,定時器,事件監(jiān)聽)
clearInterval(this.timerid);
}
// render方法在組件初次渲染時會執(zhí)行一次,在之后的組件每次更新時都會執(zhí)行一次
render() { //渲染組件模板到視圖
return (
<div>
<h1 className="class" id="big" onClick={() => { this.handleClick() }}>hello reactjs</h1>
{/* 父組件先更新更新的時候子組件變化子組件更新子組件更新完父組件才更新完成 */}
<Child title={this.state.count} />
</div>
);
}
handleClick() {//組件狀態(tài)
this.setState({ count1 });
}
}
export default App;子文件
import React, { Component } from 'react';
class Child extends Component {
// 掛載期(掛載期的方法會自動執(zhí)行,而且只執(zhí)行一次)
constructor(props) {//這個函數(shù)會在組件掛載前就執(zhí)行,組件并沒有顯示在頁面上
super(props);
console.log('constructor');
this.state = {}//初始化組件狀態(tài)
}
componentWillReceiveProps(nextProps) {//Props更新,才會執(zhí)行(可以用這個函數(shù)來監(jiān)聽Props的變化)
// nextProps 是最新的數(shù)據(jù)的對象
// 用這個函數(shù)監(jiān)聽父組件傳來的數(shù)據(jù)是否有變化
// 傳過來的值是新的就會執(zhí)行,傳過來的值不是新的就不會執(zhí)行
// 這里傳過來的數(shù)據(jù)是一個對象,要將對象轉(zhuǎn)換為字符串進(jìn)行比較,因為對象每次更新地址都會變化,只是值不變
console.log('Child componentWillReceiveProps 將要更新');
}
componentWillUpdate() {
console.log('Child componentWillUpdate 將要更新');
}
componentDidUpdate() {
console.log('Child componentDidUpdate 更新完成');
}
render() {
return (
<div>
</div>
);
}
}
export default Child;6.受控組件—表單處理
特別說明:HTML中表單元素是可輸入的,也就是有自己的可變狀態(tài),但是默認(rèn)表單元素的值不受所在組件state的控制,也就是表單元素所在組件無法實時獲取最新的表單元素值
非受控組件
表單元素值不受所在組件狀態(tài)的控制,我們將這樣的表單元素稱為:非受控組件
受控組件
受控組件:值受到React組件狀態(tài)控制的表單元素
一般是通過defaultValue屬性,onChange事件配合將非受控組件變?yōu)槭芸亟M件
- 文本框、富文本框、下拉框操作value屬性
- 復(fù)選框操作checked屬性
import './App.css';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件 ( 主要使用這個 )
//使用 rsf 快速創(chuàng)建 函數(shù)式組件
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.state = {
phone: '',
isRead: false//是否勾選協(xié)議
}
}
handleChange(e) {
this.setState({
phone: e.target.value
}, () => {
console.log(this.state);
})
}
handleChecked(e) {
this.setState({
isRead: e.target.checked
}, () => {
console.log(this.state);
})
}
render() { //渲染組件模板到視圖
return (
<div>
{/* 非受控元素變成受控元素,通過value和onChange綁定實現(xiàn) */}
{/* value綁定,將組件狀態(tài)綁定到元素的value屬性 */}
{/* onChange綁定,當(dāng)元素的值發(fā)生改變時更新元素的值到組件狀態(tài) */}
<input type="text" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='請輸入手機(jī)號' />
<input type="checkbox" value={this.state.isRead} onChange={(e) => { this.handleChecked(e) }} />
</div>
);
}
}
export default App;多表單元素操作
- 給表單元素添加name屬性,名稱與state相同
- 根據(jù)表單元素類型獲取對應(yīng)值
- 在change事件處理程序中通過[name]來修改對應(yīng)的state
import './App.css';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件 ( 主要使用這個 )
//使用 rsf 快速創(chuàng)建 函數(shù)式組件
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.state = {
phone: '',
pass: '',
isRead: false//是否勾選協(xié)議
}
}
handleChange(e) {
// 獲取目標(biāo)控件input元素對應(yīng)的別名
// e.target.name
this.setState({
// 因為別名是個變量,所以用方括號括起來
// 如果是單選。復(fù)選框,通過e.target.checked取值
// 如果是其它元素,通過e.target.value取值
[e.target.name]: ((e.target.type == 'checkbox' || e.target.type == 'radio') ? e.target.checked : e.target.value)
}, () => {
console.log(this.state);
})
}
login() {
// 發(fā)送登錄請求
// 刪除里面沒有用的或者取出有用的傳過去
// 這樣直接刪除會影響之前的解決方法是深拷貝
// delete this.state.isRead;
// 深拷貝state
var newState = JSON.parse(JSON.stringify(this.state));
delete newState.isRead;
console.log(newState);
// user_login(this.state).then((res)=>{
// })
}
render() { //渲染組件模板到視圖
return (
<div>
{/* 非受控元素變成受控元素,通過value和onChange綁定實現(xiàn) */}
{/* value綁定,將組件狀態(tài)綁定到元素的value屬性 */}
{/* onChange綁定,當(dāng)元素的值發(fā)生改變時更新元素的值到組件狀態(tài) */}
<input type="text" name="phone" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='請輸入手機(jī)號' /><br />
<input type="password" name="pass" value={this.state.pass} onChange={(e) => { this.handleChange(e) }} placeholder='請輸入密碼' />
<input type="checkbox" name="isRead" value={this.state.isRead} onChange={(e) => { this.handleChange(e) }} />
</div>
);
}
}
export default App;
到此這篇關(guān)于React組件的使用詳細(xì)講解的文章就介紹到這了,更多相關(guān)React組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從零開始最小實現(xiàn)react服務(wù)器渲染詳解
這篇文章主要介紹了從零開始最小實現(xiàn)react服務(wù)器渲染詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
ForwardRef?useImperativeHandle方法demo
這篇文章主要為大家介紹了ForwardRef?useImperativeHandle方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
每天一個hooks學(xué)習(xí)之useUnmount
這篇文章主要為大家介紹了每天一個hooks學(xué)習(xí)之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
react性能優(yōu)化useMemo與useCallback使用對比詳解
這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

