React方向:react中5種Dom的操作方式

1愈魏、通過原生JS獲取Dom去操作

通過document.querySelector('#title')原生js的方式去拿到dom節(jié)點(diǎn)呜呐,然后去進(jìn)行操作疮方。

import {Component} from "react";

class App extends Component {
    //定義獲取Dom的函數(shù)
    handleGetDom(){
        let title = document.querySelector('#title');
        console.log(title);
        title.style.background = 'skyblue'
    }

    render() {
        return (
            <>
                <h1 id="title">測試節(jié)點(diǎn)</h1>
                <button onClick={this.handleGetDom}>點(diǎn)擊操作Dom</button>
            </>
        )
    }
}

export default App;
2喷斋、通過react官方提供的ref以及refs去獲取DOM元素

但是需要值得一提的是唁毒,官方的refs將在未來的時間段內(nèi)會被廢除,并且因ref掛載的節(jié)點(diǎn)是掛載在組件實(shí)例上星爪,因此函數(shù)不能使用es5的寫法浆西,如果使用es5的寫法,需要.bind去更改this指向顽腾,否則this.refs拿到的將是undefined近零。

    handleGetDom = () => {
        console.log(this);
        let { header } = this.refs;
        header.style.background = 'gold';
    }

    render() {
        return (
            <>
                <h1 ref={'header'}>測試節(jié)點(diǎn)</h1>
                <button onClick={this.handleGetDom}>點(diǎn)擊操作Dom</button>
            </>
        )
    }
運(yùn)行結(jié)果.png
3、通過react官方提供的ReactDOM.findDOMNode去操作DOM元素

使用這種方式需要注意的是ReactDOM需要使用import ReactDOM from 'react-dom'提前引入進(jìn)來抄肖,否則是找不到findDOMNode這個方法的久信。

import {Component} from "react";
import ReactDOM from 'react-dom'

class App extends Component {
    handleGetDom = () => {
        let title = document.querySelector('#title');
        ReactDOM.findDOMNode(title).style.background = 'green'
    }

    render() {
        return (
            <>
                <h1 id="title">測試節(jié)點(diǎn)</h1>
                <button onClick={this.handleGetDom}>點(diǎn)擊操作Dom</button>
            </>
        )
    }
}

export default App;
4、通過react官方推薦的ref回調(diào)函數(shù)去獲取DOM元素

前面涉及到refs即將被刪除漓摩,因此裙士,新版本 React 不推薦 使用ref string去操作DOM,轉(zhuǎn)而推薦我們使用 ref callback的使用方式管毙,通過這種方式掛載到實(shí)例對象上面腿椎,只需要在回調(diào)函數(shù)中使用this.屬性名即可

import {Component} from "react";

class App extends Component {
    handleGetDom = () => {
        this._title.style.background = 'red'
    }

    render() {
        return (
            <>
                <h1 ref={(ele)=>{this._title = ele}}>測試節(jié)點(diǎn)</h1>
                <button onClick={this.handleGetDom}>點(diǎn)擊操作Dom</button>
            </>
        )
    }
}

export default App;
執(zhí)行結(jié)果.png
5、react官方推薦的寫法:React.createRef()

Refs 是使用 React.createRef() 創(chuàng)建的夭咬,并通過 ref 屬性附加到 React 元素啃炸。在構(gòu)造組件時,通常將 Refs 分配給實(shí)例屬性卓舵,以便可以在整個組件中引用它們南用。當(dāng) ref 被傳遞給 render 中的元素時,對該節(jié)點(diǎn)的引用可以在 ref 的 current 屬性中被訪問。

ref 的值根據(jù)節(jié)點(diǎn)的類型而有所不同:

  • 當(dāng) ref 屬性用于 HTML 元素時训枢,構(gòu)造函數(shù)中使用 React.createRef() 創(chuàng)建的 ref 接收底層 DOM 元素作為其 current 屬性。
  • 當(dāng) ref 屬性用于自定義 class 組件時忘巧,ref 對象接收組件的掛載實(shí)例作為其 current 屬性恒界。
  • 不能在函數(shù)組件上使用 ref 屬性,因為他們沒有實(shí)例砚嘴。
示例:

通過實(shí)現(xiàn)監(jiān)聽輸入框的值以及將輸入框的值追加到獲取到的dom元素ul中去十酣,在通過獲取ul的子節(jié)點(diǎn)li,去給所有的li添加點(diǎn)擊事件

import React, {Component} from "react";

class App extends Component {
    
    state = {
        msg:''
    }

    // 使用官方推薦的獲取節(jié)點(diǎn)的寫法進(jìn)行操作
    title = React.createRef();

    // 監(jiān)聽輸入框的值
    handleChange = (e) => {
        this.setState({
            msg:e.target.value
        })
    }

    // 將監(jiān)聽到輸入框的值追加到獲取到的ul的DOM元素中去
    handleAdd = () => {
        let {current} = this.title; //解構(gòu)refs綁定的dom
        current.innerHTML += `<li>${this.state.msg}</li>`;
        // 追加完成后清空輸入框
        this.setState({
            msg:''
        })
        // 打印下是否獲取到了ul下的所有子節(jié)點(diǎn)
        console.log(current.childNodes);
        // 通過操作DOM給每個子節(jié)點(diǎn)li再次添加點(diǎn)擊事件
        this.title.current.childNodes.forEach((item,index)=>{
            item.onclick = ()=>{
                item.innerHTML +=`<b>點(diǎn)擊了li元素<b>`;
            }
        })
    }

    render() {
        return (
            <>
                <input type="text" value={this.state.msg} onChange={this.handleChange}></input>
                <button onClick={this.handleAdd}>添加數(shù)據(jù)</button>
                <ul ref={this.title}></ul>
            </>
        )
    }
}

export default App;
執(zhí)行結(jié)果.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末际长,一起剝皮案震驚了整個濱河市耸采,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌工育,老刑警劉巖虾宇,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異如绸,居然都是意外死亡嘱朽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門怔接,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搪泳,“玉大人,你說我怎么就攤上這事扼脐“毒” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵瓦侮,是天一觀的道長艰赞。 經(jīng)常有香客問我,道長脏榆,這世上最難降的妖魔是什么猖毫? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮须喂,結(jié)果婚禮上吁断,老公的妹妹穿的比我還像新娘。我一直安慰自己坞生,他們只是感情好仔役,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是己,像睡著了一般又兵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天沛厨,我揣著相機(jī)與錄音宙地,去河邊找鬼。 笑死逆皮,一個胖子當(dāng)著我的面吹牛宅粥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播电谣,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秽梅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剿牺?” 一聲冷哼從身側(cè)響起企垦,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晒来,沒想到半個月后钞诡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湃崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年臭增,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竹习。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡誊抛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出整陌,到底是詐尸還是另有隱情拗窃,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布泌辫,位于F島的核電站随夸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏震放。R本人自食惡果不足惜宾毒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殿遂。 院中可真熱鬧诈铛,春花似錦、人聲如沸墨礁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩静。三九已至焕毫,卻和暖如春蹲坷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑飒。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工循签, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疙咸。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓懦底,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罕扎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • react修改頁面dom的兩種辦法 一:使用選擇器: 1丐重、引入react-dom import ReactDom...
    邊同學(xué)_abe0閱讀 3,089評論 0 0
  • 1. context 創(chuàng)建一個Context對象 注意 : 將 undefined 傳遞給 Provider 時腔召,...
    小王加油閱讀 329評論 0 0
  • React 官網(wǎng)學(xué)習(xí)筆記 所有 React 組件都必須像純函數(shù)一樣保護(hù)它們的 props 不被更改 在 React...
    HeroMeikong閱讀 652評論 0 1
  • 歡迎訪問主頁,有更多文章內(nèi)容轉(zhuǎn)載請注明原出處原文鏈接地址:React中Refs的使用方法 什么是Refs Refs...
    Vincent_cy閱讀 2,313評論 0 2
  • 某些情況下需要在典型數(shù)據(jù)流外強(qiáng)制修改子代扮惦。要修改的子代可以是React組件實(shí)例臀蛛,也可以是DOM元素。這時就要用到 ...
    我向你奔閱讀 792評論 0 1