国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ReactDOM You Should

mo0n1andin / 750人閱讀

摘要:并不是組件中的任何地方都能夠使用獲取結(jié)構(gòu),只對(duì)掛載后的組件生效。組件的一個(gè)特殊屬性,接受一個(gè)回調(diào)函數(shù)作為參數(shù)。反之,則表示卸載失敗。再看一下這段代碼這個(gè)回調(diào)函數(shù)其實(shí)是沒(méi)有參數(shù)的,但是,當(dāng)方法變成異步方法之后,說(shuō)不定就會(huì)向其注入一些參數(shù)了。

react的組件的開(kāi)發(fā)過(guò)程中,一般來(lái)說(shuō),我們并不會(huì)真正的去操作dom。只有在頂層組件的渲染的過(guò)程中,我們借助ReactDOM.render()方法,將我們的應(yīng)用渲染到html結(jié)構(gòu)中。然而,由于react框架自身的限制,在某些特定的情況下,我們必須要手動(dòng)的操作dom。這時(shí),我們就需要使用ReactDOM了。

先說(shuō)一個(gè)小事,在react 0.14版本的時(shí)候,ReactDOM就從react的核心庫(kù)中分離出來(lái)了。所以,根據(jù)你使用的react版本的不同,我們引入ReactDOM的方式也就不一樣。總而言之,也就下面兩種基本的方法。

以下所有的代碼,都會(huì)通過(guò)EcmaScript6進(jìn)行編寫(xiě)

React < 0.14之前的版本

import React, { ReactDOM } from "react"

React >= 0.14之后的版本

yarn add react-dom
import ReactDOM from "react-dom"
ReactDOM的API

ReactDOM給我們提供了僅僅三個(gè)api。所以相對(duì)來(lái)說(shuō)學(xué)習(xí)起來(lái)還是比較簡(jiǎn)單的。

這三個(gè)api 如下:

ReactDOM.findDOMNode

ReactDOM.unmountComponentAtNode

ReactDOM.render

下面,我們就簡(jiǎn)單的扯扯,這三個(gè)api我們應(yīng)該怎么使用。

ReactDOM.findDOMNode

在絮叨這個(gè)api之前啊,先扯兩個(gè)你應(yīng)該知道的東西。

Q:DOM被真正添加到HTML中是什么時(shí)候?

A:生命周期方法componentDidMountcomponentDidUpdate

Q:還有沒(méi)有其他獲取DOM的方法

A:有,比如this.refs

說(shuō)這干啥,就是為了告訴你應(yīng)該什么時(shí)候去獲取DOM。不要以為在任何地方都能獲取,否則更多等待你的就是error * 3

好了,下面我們就好好扯扯findDOMNode該怎么用。

先看一下接口定義:

DOMElement findDOMNode(ReactComponent)

簡(jiǎn)單的說(shuō)就是:給它一點(diǎn)綠蔭(ReactComponent),還你一片森林(DOM Tree)。

比如,下面這個(gè)小demo,在組件加載完成的時(shí)候,獲取真正的dom結(jié)構(gòu)。

import React from "react";
import {findDOMNode, render} from "react-dom";

class App extends React.Component {
    constructor(props) {
        super(props)
        console.info("GET DOM IN %c constructor", "color:red")
        console.log(findDOMNode(this))
    }

    componentWillMount() {
        console.info("GET DOM IN %c componentWillMount", "color:red")
        console.log(findDOMNode(this))
    }

    componentDidMount() {
        console.info("GET DOM IN %c componentDidMount", "color:red")
        console.log(findDOMNode(this))
    }

    render() {
        return (
            
The menu
The person information
The content wrapper
The footer
) } } render(, document.getElementById("root"));

哎呀,慘不忍睹。

所以,把constructorfindDOMNode操作去掉,你會(huì)看到:

可以看出,在componentWillMountfindDOMNode的操作結(jié)果是null

但是,你會(huì)不會(huì)想,不是吧,返回null不能完全說(shuō)明我沒(méi)獲取到元素啊。的確,比如:

import React from "react";
import {findDOMNode, render} from "react-dom";

class App extends React.Component {
    constructor(props) {
        super(props)
        // console.info("GET DOM IN %c constructor", "color:red")
        // console.log(findDOMNode(this))
    }

    componentWillMount() {
        console.info("GET DOM IN %c componentWillMount", "color:red")
        console.log(findDOMNode(this))
    }

    componentDidMount() {
        console.info("GET DOM IN %c componentDidMount", "color:red")
        console.log(findDOMNode(this))
    }

    render() {
        return null
    }
}

render(, document.getElementById("root"));

如你所愿,findDOMNode的操作結(jié)果都是null。但是,對(duì)比之中你應(yīng)該清楚兩件事。

并不是組件中的任何地方都能夠使用findDOMNode獲取DOM結(jié)構(gòu),findDOMNode只對(duì)掛載后的組件生效。

如果組件的render函數(shù)返回null,則在任何地方使用findDOMNode的結(jié)果都是null。

ReactDOM.findDOMNode with ref

先扯兩句refref--組件的一個(gè)特殊屬性,接受一個(gè)回調(diào)函數(shù)作為參數(shù)。兩種情況:

給原生的html結(jié)構(gòu)添加ref屬性,其參數(shù)就是其對(duì)應(yīng)的DOM元素。這時(shí)候,直接使用即可。

class聲明的組件添加ref屬性的時(shí)候,參數(shù)則是這個(gè)已經(jīng)加載完成的react組件。這時(shí)候,就可以和findDOMNode來(lái)個(gè)親密碰撞了。

如下面的操作:

import React from "react";
import {findDOMNode, render} from "react-dom";

class FieldInput extends React.Component {
    render() {
        return 
    }
}

class App extends React.Component {
    constructor(props) {
        super(props)
    }

    componentDidMount() {
        console.info("The value of %c this.input", "color:red")
        console.log(this.input)
        console.info("The value of %c findDOMNode(this.input)", "color:red")
        console.log(findDOMNode(this.input))
    }

    render() {
        return  { this.input = input }}
        />
    }
}

render(, document.getElementById("root"));

結(jié)果,就是你想的那樣美好。

最后呢,記住一句話,findDOMNode不能用在函數(shù)式組件中哦

ReactDOM.unmountComponentAtNode

來(lái)先把接口的名稱拆分一下:

unmount: 卸載

component: 組件

at: 在

node: 節(jié)點(diǎn)(DOM元素)

意思就是,從DOM元素中卸載已經(jīng)掛載的組件,除此呢,還會(huì)清除它的事件處理器和state。來(lái),看下面的代碼:

import React, { Component } from "react";
import {findDOMNode, render, unmountComponentAtNode} from "react-dom";

class FieldOne extends Component {
    componentWillUnmount() {
        console.log("%c FieldOne will unmount")
    }
    render() {
        return 
The One
} } class FieldTwo extends Component { componentWillUnmount() { console.log("%c FieldTwo will unmount") } render() { return
The Two
} } class App extends Component { constructor(props) { super(props) } componentDidMount() { render(, this.fieldOne) } handleClick() { console.log(unmountComponentAtNode(this.fieldOne)) console.log(unmountComponentAtNode(this.fieldTwo)) } render() { return (
this.fieldOne = fieldOne}>
this.fieldTwo = fieldTwo}>
) } } render(, document.getElementById("root"))

簡(jiǎn)單的分析這段代碼之前,先扯一個(gè)小的問(wèn)題。react中的組件渲染有幾種方式?一般來(lái)說(shuō),兩種:

通過(guò)下面render函數(shù),將組件渲染到DOM結(jié)構(gòu)中。

React自身渲染

這兩種渲染方式,分別對(duì)應(yīng)于上述代碼中的FieldOneFieldTwo組件的渲染方式。所以,你必須先搞明白一件事情,unmountComponentAtNode并不能卸載所有已經(jīng)掛載到DOM中的組件,它只能卸載通過(guò)render函數(shù)渲染的組件。

所以,當(dāng)我們點(diǎn)擊button按鈕的時(shí)候,會(huì)在控制臺(tái)中看到,下面這些東西。

其中,當(dāng)unmountComponentAtNode的返回值為true的時(shí)候,表示卸載成功。反之,則表示卸載失敗。
下面是點(diǎn)擊按鈕之前的DOM結(jié)構(gòu)的對(duì)比情況。
點(diǎn)擊前

點(diǎn)擊后

ReactDOM.render

react最讓人爽的地方就是,接口名稱的語(yǔ)意化很明顯。所以,從字面意義上我們就能知道render是干啥的。干啥?用于渲染。

先簡(jiǎn)單的了解下接口定義。

ReactDOM.render(
    ReactComponent,
      DOMElement,
      [callback]
)

一句話概括:

渲染一個(gè)ReactComponent,將其作為DOMElementinnerHTML

記住兩件事:

這個(gè)方法只會(huì)進(jìn)行一次整體更新

第一次渲染后,會(huì)將DOMElementinnerHTMLReactComponent的實(shí)例所替換,之后的渲染,便采用高效的diff算法進(jìn)行更新。

幾個(gè)問(wèn)題:

這個(gè)方法是同步的還是異步的?

這個(gè)方法有沒(méi)有返回值?

callback函數(shù),有參數(shù)嗎?

來(lái)一起扯扯:

先看這個(gè)代碼:

import React from "react";
import {findDOMNode, render} from "react-dom";

// 函數(shù)式組件一
const FieldInput = (props) => {
    return (
        
) } class App extends React.Component { constructor(props) { super(props) } render() { return (
The header
) } } console.log("%c begin render", "color:red") const baseComponent = render(, document.getElementById("root")) console.log(baseComponent) console.log("%c end render", "color:red")

結(jié)果呢,是這樣的。不錯(cuò),同步調(diào)用的。而且返回值就是我們的根組件的實(shí)例。

挺好的,可是,官方有聲明:

所以嘞,我們應(yīng)該避免使用這種方式獲取根組件實(shí)例(一般也不會(huì)采用這種方法操作根組件實(shí)例,只需要知道有這么回事就好了)。

再看一下這段代碼:

import React from "react";
import {findDOMNode, render} from "react-dom";

class App extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        return (
            
test
) } } render(, document.getElementById("root"), (...args) => { console.log(args) // [] })

這個(gè)回調(diào)函數(shù)其實(shí)是沒(méi)有參數(shù)的,但是,當(dāng)render方法變成異步方法之后,說(shuō)不定就會(huì)向其注入一些參數(shù)了。具體的,拭目以待。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85176.html

相關(guān)文章

  • 【譯】State and Lifecycle (State和生命周期)

    摘要:結(jié)果如下打開(kāi)試試下一步,我們將把組件功能自己設(shè)置定時(shí)器并且能每秒更新。這是一個(gè)設(shè)置定時(shí)器的好地方注意我們是怎么保存定時(shí)器的。我們將在這個(gè)生命周期的函數(shù)方法中卸載掉定時(shí)器最后,我們會(huì)每一秒跑方法。 下面是react官方文檔的個(gè)人翻譯,如有翻譯錯(cuò)誤,請(qǐng)多多指出原文地址:https://facebook.github.io/re... Consider the ticking clock e...

    dadong 評(píng)論0 收藏0
  • 【譯】渲染Elements

    摘要:注不做翻譯是中最小的構(gòu)建部件。在里渲染讓我們看一下在下面有在你文件中無(wú)處不在的標(biāo)簽我們會(huì)把這元素成為元素因?yàn)榈乃袞|西都會(huì)放在這個(gè)元素里面。通過(guò)方法,我們能吧渲染到我們根節(jié)點(diǎn)上。更新被渲染的是不可變的。 下面是react官方文檔的個(gè)人翻譯,如有翻譯錯(cuò)誤,請(qǐng)多多指出原文地址:https://facebook.github.io/re...特別感謝Hevaen,同時(shí)也向豪大React群所有...

    LoftySoul 評(píng)論0 收藏0
  • React

    摘要:語(yǔ)法是一種語(yǔ)法的拓展語(yǔ)言,在中官方也推薦使用描述用戶界面,使用起來(lái)會(huì)比較快捷而且易讀不是一門新的語(yǔ)言,可以理解為是一種語(yǔ)法糖,作用就是能夠讓我們更加直觀的在中創(chuàng)建標(biāo)簽,最終還是會(huì)被編譯為語(yǔ)法,例如我們看一段代碼上面的語(yǔ)法最終會(huì)被編譯為語(yǔ)法, Reatc JSX語(yǔ)法 jsx是一種JavaScript語(yǔ)法的拓展語(yǔ)言,在React中官方也推薦使用jsx描述用戶界面,使用起來(lái)會(huì)比較快捷而且易讀...

    techstay 評(píng)論0 收藏0
  • ReactDOM.render源碼解析-1

    摘要:本文將對(duì)源碼做一個(gè)初步解析。首先在方法中校驗(yàn)參數(shù)是否合法,然后調(diào)用在中,調(diào)用拿到了的一個(gè)實(shí)例,調(diào)用拿到了,用于注入到,和作為返回值,調(diào)用開(kāi)始調(diào)度過(guò)程在中,首先清理了中的所有子節(jié)點(diǎn),然后了一個(gè)并返回是如何調(diào)度的是一個(gè)什么樣的類的操作是在哪里 初步看了react-dom這個(gè)包的一些源碼,發(fā)現(xiàn)其比react包要復(fù)雜得多,react包中基本不存在跨包調(diào)用的情況,他所做的也僅僅是定義了React...

    _Zhao 評(píng)論0 收藏0
  • React源碼系列一之createElement

    前言:使用react也有二年多了,一直停留在使用層次。雖然很多時(shí)候這樣是夠了。但是總覺(jué)得不深入理解其背后是的實(shí)現(xiàn)邏輯,很難體會(huì)框架的精髓。最近會(huì)寫(xiě)一些相關(guān)的一些文章,來(lái)記錄學(xué)習(xí)的過(guò)程。 備注:react和react-dom源碼版本為16.8.6 本文適合使用過(guò)React進(jìn)行開(kāi)發(fā),并有一定經(jīng)驗(yàn)的人閱讀。 好了閑話少說(shuō),我們一起來(lái)看源碼吧寫(xiě)過(guò)react知道,我們使用react編寫(xiě)代碼都離不開(kāi)webpa...

    Zhuxy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<