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

React組件的使用詳細(xì)講解

 更新時(shí)間:2022年11月14日 09:24:57   作者:茹嗨瑞  
React組件分為函數(shù)組件與class組件;函數(shù)組件是無(wú)狀態(tài)組件,class稱為類組件;函數(shù)組件只有props,沒(méi)有自己的私有數(shù)據(jù)和生命周期函數(shù);class組件有自己私有數(shù)據(jù)(this.state)和生命周期函數(shù)

1.組件的創(chuàng)建方式

函數(shù)式組件

特別注意這里的寫(xiě)法,如果要在 JSX 里寫(xiě) js 表達(dá)式(只能是表達(dá)式,不能是流程 控制語(yǔ)句),就需要加 {},包括注釋也是一樣,并且可以多層嵌套

// 函數(shù)式組件
// 寫(xiě)組件模板的時(shí)候必須遵循jsx語(yǔ)法
function App() {
  return (
    <div className="App">
      hello reactjs
    </div>
  );
}

class組件

ES6 的加入讓 JavaScript 直接支持使用 class 來(lái)定義一個(gè)類,react 的第二種創(chuàng)建組件 的方式就是使用的類的繼承,ES6 class 是目前官方推薦的使用方式,它使用了 ES6 標(biāo)準(zhǔn) 語(yǔ)法來(lái)構(gòu)建

// class組件
// 注意:組件名必須首字母大寫(xiě)(為了和普通標(biāo)識(shí)符區(qū)分開(kāi)),必須繼承自 React.Component 組件
// class的好處就是可以在render并列的位置
// class組件中,使用的this是當(dāng)前組件實(shí)例
// App這個(gè)組件必須繼承自React.Component
class App extends React.Component {
  // App這個(gè)組件要想渲染什么由內(nèi)部的render方法決定,必須要有render方法,這個(gè)render方法負(fù)責(zé)渲染組件的模板就是有什么標(biāo)簽
  // js中如果return后面沒(méi)有語(yǔ)句就會(huì)自動(dòng)加分號(hào)
  // 當(dāng)想要使用插件時(shí)得改變 組件文件名的后綴改為jsx
  // 定義組件狀態(tài)state,組件數(shù)據(jù)
  // 在constructor函數(shù)中對(duì)組件狀態(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ī)范

組件名稱必須以大寫(xiě)字母開(kāi)頭。

<Welcome name="james">

小駝峰命名來(lái)定義屬性

<Welcome className="blue" tabIndex="1" >

3.組件傳值props

函數(shù)組件通過(guò)參數(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

類組件通過(guò)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ù)氖且粋€(gè)包裹元素(包裹其他標(biāo)簽), 最終在頁(yè)面中不會(huì)渲染.

4.組件樣式sass

在react組件中,使用sass編寫(xiě)組件樣式,需要依賴sass插件。

使用步驟:

下載插件

npm i sass -D

創(chuàng)建.scss文件,編寫(xiě)sass代碼

在組件中引入scss文件

import './App.scss';

5.組件的生命周期函數(shù)

主文件

import './App.css';
import Child from './Child';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件  ( 主要使用這個(gè) )
//使用 rsf 快速創(chuàng)建 函數(shù)式組件
import React, { Component } from 'react';
class App extends Component {
  // 掛載期(掛載期的方法會(huì)自動(dòng)執(zhí)行,而且只執(zhí)行一次)
  constructor(props) {//這個(gè)函數(shù)會(huì)在組件掛載前就執(zhí)行,組件并沒(méi)有顯示在頁(yè)面上
    super(props);
    console.log('constructor');
    this.state = {}//初始化組件狀態(tài)
  }
  componentWillMount() {//掛載前
    console.log('componentWillMount 將要掛載');
  }
  componentDidMount() {//掛載完成,組件就會(huì)顯示在頁(yè)面上
    console.log('componentDidMount 掛載完成');
    // 在這里發(fā)送網(wǎng)絡(luò)請(qǐng)求,創(chuàng)建定時(shí)器,事件監(jiān)聽(tīng),理由是:這個(gè)方法只執(zhí)行一次,而且會(huì)自動(dòng)執(zhí)行
    // 這里的this指的是組件實(shí)例this.timerid就是將定時(shí)器保存在當(dāng)前組件實(shí)例身上,就可以在各個(gè)組件生命周期共享
    // 還可以直接保存在組件狀態(tài)中,只不過(guò)保存在組件狀態(tài)中定時(shí)器是可以改變的,如果不變化就可以保存在組件實(shí)例身上
    this.timerid = setInterval(() => {
      console.log('定時(shí)器在執(zhí)行');
    }, 1000)
  }
  // 更新期(更新期的方法可能會(huì)反復(fù)調(diào)用執(zhí)行)
  // 性能優(yōu)化時(shí)寫(xiě)的地方
  shouldComponentUpdate(nextProps, nextState) {//控制組件是否更新,目的是提示組件性能(性能優(yōu)化)
    // 組件性能優(yōu)化:把有效的更新進(jìn)行更新,無(wú)效的更新就不讓它進(jìn)行更新
    // 組件狀態(tài)是否有變化,如果有變化就更新,沒(méi)有變化就不更新
    // 當(dāng)setState中的數(shù)據(jù)和state中的數(shù)據(jù)相等沒(méi)有必要更新
    // if (this.state == nextState) {
    // 滿足條件就不更新,傳進(jìn)來(lái)的state是兩個(gè)對(duì)象,當(dāng)每次更新的時(shí)候?qū)ο笏傅牡刂范际遣灰粯拥模圆荒苤苯颖容^,要將對(duì)象轉(zhuǎn)換為字符串進(jìn)行比較
    if (JSON.stringify(this.state) == JSON.stringify(nextState)) {
      return false;
    } else {
      return true;//返回false 表示放棄更新,返回true 表示繼續(xù)更新
    }
  }
  componentWillReceiveProps(nextProps) {//Props更新,才會(huì)執(zhí)行(可以用這個(gè)函數(shù)來(lái)監(jiān)聽(tīng)Props的變化)
    // nextProps 是最新的數(shù)據(jù)的對(duì)象
    // 用這個(gè)函數(shù)監(jiān)聽(tīng)父組件傳來(lái)的數(shù)據(jù)是否有變化
    console.log('componentWillReceiveProps 將要更新');
  }
  componentWillUpdate() {
    console.log('componentWillUpdate 將要更新');
  }
  componentDidUpdate() {
    console.log('componentDidUpdate 更新完成');
  }
  // 卸載期
  componentWillUnmount() {
    console.log('componentWillUnmount 將要卸載');
    // 在這里釋放所占用的資源(網(wǎng)路請(qǐng)求,定時(shí)器,事件監(jiān)聽(tīng))
    clearInterval(this.timerid);
  }
  // render方法在組件初次渲染時(shí)會(huì)執(zhí)行一次,在之后的組件每次更新時(shí)都會(huì)執(zhí)行一次
  render() { //渲染組件模板到視圖
    return (
      <div>
        <h1 className="class" id="big" onClick={() => { this.handleClick() }}>hello reactjs</h1>
        {/* 父組件先更新更新的時(shí)候子組件變化子組件更新子組件更新完父組件才更新完成 */}
        <Child title={this.state.count} />
      </div>
    );
  }
  handleClick() {//組件狀態(tài)
    this.setState({ count1 });
  }
}
export default App;

子文件

import React, { Component } from 'react';
class Child extends Component {
    // 掛載期(掛載期的方法會(huì)自動(dòng)執(zhí)行,而且只執(zhí)行一次)
    constructor(props) {//這個(gè)函數(shù)會(huì)在組件掛載前就執(zhí)行,組件并沒(méi)有顯示在頁(yè)面上
        super(props);
        console.log('constructor');
        this.state = {}//初始化組件狀態(tài)
    }
    componentWillReceiveProps(nextProps) {//Props更新,才會(huì)執(zhí)行(可以用這個(gè)函數(shù)來(lái)監(jiān)聽(tīng)Props的變化)
        // nextProps 是最新的數(shù)據(jù)的對(duì)象
        // 用這個(gè)函數(shù)監(jiān)聽(tīng)父組件傳來(lái)的數(shù)據(jù)是否有變化
        // 傳過(guò)來(lái)的值是新的就會(huì)執(zhí)行,傳過(guò)來(lái)的值不是新的就不會(huì)執(zhí)行
        // 這里傳過(guò)來(lái)的數(shù)據(jù)是一個(gè)對(duì)象,要將對(duì)象轉(zhuǎn)換為字符串進(jìn)行比較,因?yàn)閷?duì)象每次更新地址都會(huì)變化,只是值不變
        console.log('Child componentWillReceiveProps 將要更新');
    }
    componentWillUpdate() {
        console.log('Child componentWillUpdate 將要更新');
    }
    componentDidUpdate() {
        console.log('Child componentDidUpdate 更新完成');
    }
    render() {
        return (
            <div>

            </div>
        );
    }
}
export default Child;

6.受控組件—表單處理

特別說(shuō)明:HTML中表單元素是可輸入的,也就是有自己的可變狀態(tài),但是默認(rèn)表單元素的值不受所在組件state的控制,也就是表單元素所在組件無(wú)法實(shí)時(shí)獲取最新的表單元素值

非受控組件

表單元素值不受所在組件狀態(tài)的控制,我們將這樣的表單元素稱為:非受控組件

受控組件

受控組件:值受到React組件狀態(tài)控制的表單元素

一般是通過(guò)defaultValue屬性,onChange事件配合將非受控組件變?yōu)槭芸亟M件

  • 文本框、富文本框、下拉框操作value屬性
  • 復(fù)選框操作checked屬性
import './App.css';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件  ( 主要使用這個(gè) )
//使用 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>
        {/* 非受控元素變成受控元素,通過(guò)value和onChange綁定實(shí)現(xiàn) */}
        {/* value綁定,將組件狀態(tài)綁定到元素的value屬性 */}
        {/* onChange綁定,當(dāng)元素的值發(fā)生改變時(shí)更新元素的值到組件狀態(tài) */}
        <input type="text" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='請(qǐng)輸入手機(jī)號(hào)' />
        <input type="checkbox" value={this.state.isRead} onChange={(e) => { this.handleChecked(e) }} />
      </div>
    );
  }
}
export default App;

多表單元素操作

  • 給表單元素添加name屬性,名稱與state相同
  • 根據(jù)表單元素類型獲取對(duì)應(yīng)值
  • 在change事件處理程序中通過(guò)[name]來(lái)修改對(duì)應(yīng)的state
import './App.css';
//react中存在兩種形式的組件: 函數(shù)式組件, 類組件
//使用 rcc 快速創(chuàng)建 類組件  ( 主要使用這個(gè) )
//使用 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元素對(duì)應(yīng)的別名
    // e.target.name
    this.setState({
      // 因?yàn)閯e名是個(gè)變量,所以用方括號(hào)括起來(lái)
      // 如果是單選。復(fù)選框,通過(guò)e.target.checked取值
      // 如果是其它元素,通過(guò)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ā)送登錄請(qǐng)求
    // 刪除里面沒(méi)有用的或者取出有用的傳過(guò)去
    // 這樣直接刪除會(huì)影響之前的解決方法是深拷貝
    // 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>
        {/* 非受控元素變成受控元素,通過(guò)value和onChange綁定實(shí)現(xiàn) */}
        {/* value綁定,將組件狀態(tài)綁定到元素的value屬性 */}
        {/* onChange綁定,當(dāng)元素的值發(fā)生改變時(shí)更新元素的值到組件狀態(tài) */}
        <input type="text" name="phone" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='請(qǐng)輸入手機(jī)號(hào)' /><br />
        <input type="password" name="pass" value={this.state.pass} onChange={(e) => { this.handleChange(e) }} placeholder='請(qǐng)輸入密碼' />
        <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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡(jiǎn)單的React SSR服務(wù)器渲染實(shí)現(xiàn)

    簡(jiǎn)單的React SSR服務(wù)器渲染實(shí)現(xiàn)

    這篇文章主要介紹了簡(jiǎn)單的React SSR服務(wù)器渲染實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • React中遍歷數(shù)組生成標(biāo)簽問(wèn)題

    React中遍歷數(shù)組生成標(biāo)簽問(wèn)題

    這篇文章主要介紹了React中遍歷數(shù)組生成標(biāo)簽問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • React組件的生命周期深入理解分析

    React組件的生命周期深入理解分析

    組件的生命周期就是React的工作過(guò)程,就好比人有生老病死,自然界有日月更替,每個(gè)組件在網(wǎng)頁(yè)中也會(huì)有被創(chuàng)建、更新和刪除,如同有生命的機(jī)體一樣
    2022-12-12
  • React Native預(yù)設(shè)占位placeholder的使用

    React Native預(yù)設(shè)占位placeholder的使用

    本篇文章主要介紹了React Native預(yù)設(shè)占位placeholder的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • React中的useEffect四種用法分享

    React中的useEffect四種用法分享

    這篇文章主要給大家分享React中的useEffect四種用法,useEffect中 觸發(fā)更新,重復(fù)的 useEffect,依賴值觸發(fā)回調(diào),useEffect 的返回值,通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • React+ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表

    React+ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表

    ResizeObserver是JavaScript的一個(gè)API,用于監(jiān)測(cè)元素的大小變化,本文主要為大家介紹了React如何利用ResizeObserver實(shí)現(xiàn)自適應(yīng)ECharts圖表,需要的可以參考下
    2024-01-01
  • React.js中常用的ES6寫(xiě)法總結(jié)(推薦)

    React.js中常用的ES6寫(xiě)法總結(jié)(推薦)

    本篇文章中主要介紹了React.js中常用的ES6寫(xiě)法總結(jié)(推薦),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • React中常用的Hook有哪些

    React中常用的Hook有哪些

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼

    react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了react寫(xiě)一個(gè)select組件的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • React Hook的使用示例

    React Hook的使用示例

    這篇文章主要介紹了React Hook的使用示例,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

宜兰县| 龙山县| 连平县| 池州市| 汉寿县| 新津县| 江口县| 巴塘县| 江北区| 麦盖提县| 文昌市| 嘉义县| 奉化市| 同江市| 五大连池市| 明溪县| 富阳市| 平湖市| 涿州市| 开远市| 万盛区| 荆州市| 鄯善县| 阳曲县| 图木舒克市| 泰宁县| 天祝| 昌平区| 绥江县| 班戈县| 邵阳市| 彩票| 盐源县| 景德镇市| 敖汉旗| 永靖县| 增城市| 广宗县| 双峰县| 克拉玛依市| 武宣县|