亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Hello?React的組件化方式之React入門小案例演示

 更新時(shí)間:2022年10月12日 09:53:46   作者:林有酒  
這篇文章主要介紹了Hello?React的組件化方式-React入門小案例,本文通過Hello?React的案例,?來體驗(yàn)一下React開發(fā)模式,?以及jsx的語法,需要的朋友可以參考下

React初體驗(yàn)

接下來我們通過Hello React的案例, 來體驗(yàn)一下React開發(fā)模式, 以及jsx的語法

Hello React案例演練

第一步: 先引入React開發(fā)依賴

<!-- crossorigin用來解決跨域 -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

第二步: 這里我們編寫React的script代碼中,必須添加 type="text/babel",作用是可以讓babel解析jsx的語法

<script type="text/babel">
  // jsx語法編寫react代碼
</script>

第三步: 創(chuàng)建元素渲染到頁面

React18之前的做法: 通過ReactDOM.render()函數(shù)進(jìn)行渲染的, 需要傳入兩個(gè)參數(shù)

參數(shù)一: 要渲染的內(nèi)容

參數(shù)二: 渲染的內(nèi)容要掛載到的HTML元素

<!-- 掛載的HTML元素 -->
<div id="app"></div>

<!-- crossorigin用來解決跨域 -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

<!-- jsx語法編寫react代碼 -->
<script type="text/babel">
  // React18之前的做法
  
  ReactDOM.render(<h2>Hello World</h2>, document.querySelector("#app"))
</script>

React18之后的做法: 通過ReactDOM. createRoot()函數(shù)進(jìn)行渲染, 傳入一個(gè)參數(shù), 創(chuàng)建一個(gè)React根,之后渲染的內(nèi)容會(huì)包含在這個(gè)根中(可以有多個(gè)根, 一般是一個(gè)根)

<!-- 掛載的元素 -->
<div id="app"></div>
<div id="root"></div>

<!-- crossorigin用來解決跨域 -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

<!-- jsx語法編寫react代碼 -->
<script type="text/babel">
  // React18之后的做法
  
  const app = ReactDOM.createRoot(document.querySelector("#app"))
  const root = ReactDOM.createRoot(document.querySelector("#root"))
</script>

再通過root.render()函數(shù)向根組件中渲染元素, 參數(shù)傳要渲染的元素

<!-- 掛載的元素 -->
<div id="app"></div>
<div id="root"></div>

<!-- crossorigin用來解決跨域 -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

<!-- jsx語法編寫react代碼 -->
<script type="text/babel">
  // React18之后的做法
  const app = ReactDOM.createRoot(document.querySelector("#app"))
  app.render(<h2>Hello React</h2>)

  const root = ReactDOM.createRoot(document.querySelector("#root"))
  root.render(<h2>Hello React18</h2>)
</script>

Hello React案例升級

為了演練React,我們可以提出一個(gè)小的需求:

在界面顯示一個(gè)文本:Hello World

點(diǎn)擊下方的一個(gè)按鈕,點(diǎn)擊后再將文本改變?yōu)镠ello React

第一步: 將元素渲染到頁面

jsx中是通過{}綁定變量, 大家先對jsx語法有個(gè)體驗(yàn)即可, 后面會(huì)詳細(xì)講解jsx語法

<!-- 掛載的元素 -->
<div id="app"></div>

<!-- crossorigin用來解決跨域 -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

<!-- jsx語法編寫react代碼 -->
<script type="text/babel">
  const app = ReactDOM.createRoot(document.querySelector("#app"))

  // 將文本定義成變量
  let message = "Hello World"

  // 第二個(gè)小括號表示括號內(nèi)容是一個(gè)整體
  app.render((
    <div>
      <h2>{message}</h2>
      <button>改變文本</button>
    </div>
  ))
</script>

第二步: 監(jiān)聽按鈕點(diǎn)擊, 改變message的值

監(jiān)聽按鈕點(diǎn)擊jsx是通過onClick綁定一個(gè)函數(shù), 注意C一定是大寫的

const app = ReactDOM.createRoot(document.querySelector("#app"))

// 將文本定義成變量
let message = "Hello World"

// 定義一個(gè)函數(shù), 處理按鈕點(diǎn)擊事件
function btnClick() {
  // 修改數(shù)據(jù)
  message = "Hello React"

  // 修改完成后需要重新渲染界面
  app.render((
    <div>
      <h2>{message}</h2>
      <button onClick={btnClick}>改變文本</button>
    </div>
  ))
}

// 第二個(gè)小括號表示括號內(nèi)容是一個(gè)整體
app.render((
  <div>
    <h2>{message}</h2>
    <button onClick={btnClick}>改變文本</button>
  </div>
))

第三步: 簡化代碼, 上面代碼中明顯有重復(fù)代碼, 我們可以抽取到一個(gè)函數(shù)中

const app = ReactDOM.createRoot(document.querySelector("#app"))

// 將文本定義成變量
let message = "Hello World"

// 定義一個(gè)函數(shù), 處理按鈕點(diǎn)擊事件
function btnClick() {
  // 修改數(shù)據(jù)
  message = "Hello React"

  // 修改完成后需要重新渲染界面
  rootRander()
}

rootRander()
// 封裝一個(gè)渲染函數(shù)
function rootRander() {
  // 第二個(gè)小括號表示括號內(nèi)容是一個(gè)整體
  app.render((
    <div>
      <h2>{message}</h2>
      <button onClick={btnClick}>改變文本</button>
    </div>
  ))
}

Hello React的組件化

組件化的方式

Hello React這整個(gè)邏輯其實(shí)可以看做一個(gè)整體,那么我們就可以將其封裝成一個(gè)組件:

root.render()函數(shù)的參數(shù)可以是一個(gè)HTML元素, 也可以是一個(gè)組件;

所以我們可以先將之前的業(yè)務(wù)邏輯封裝到一個(gè)組件中,然后傳入到 root.render 函數(shù)中的第一個(gè)參數(shù);

在React中,如何封裝一個(gè)組件呢?

React的組件分為兩種: 類組件函數(shù)式組件

這里我們暫時(shí)使用類的方式封裝組件:

定義一個(gè)類(類名大寫,組件的名稱是必須大寫的,小寫會(huì)被認(rèn)為是HTML元素),繼承自React.Component

// 類繼承自React.Component, 才是組件
class App extends React.Component{}

實(shí)現(xiàn)當(dāng)前組件的render函數(shù), render當(dāng)中返回的jsx內(nèi)容,就是之后React會(huì)幫助我們渲染的內(nèi)容

class App extends React.Component {
  // 類中render函數(shù)的返回值, 就是要渲染到頁面的內(nèi)容
  render() {
    return (
      <div>
        <h2>Hello World</h2>
        <button>改變文本</button>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

數(shù)據(jù)依賴

組件化問題一:數(shù)據(jù)在哪里定義?

在組件中的數(shù)據(jù),我們可以分成兩類:

參與界面更新的數(shù)據(jù):當(dāng)數(shù)據(jù)變量時(shí),需要更新組件渲染的內(nèi)容;

不參與界面更新的數(shù)據(jù):當(dāng)數(shù)據(jù)變量時(shí),不需要更新將組建渲染的內(nèi)容;

參與界面更新的數(shù)據(jù)我們也可以稱之為是參與數(shù)據(jù)流,這個(gè)數(shù)據(jù)是定義在當(dāng)前對象的state中(這個(gè)名字是固定的)

我們可以通過在類的構(gòu)造器中 this.state = {定義的數(shù)據(jù)}

當(dāng)我們的數(shù)據(jù)發(fā)生變化時(shí),我們可以調(diào)用 this.setState 來更新數(shù)據(jù),并且通知React進(jìn)行update操作;

在進(jìn)行update操作時(shí),就會(huì)重新調(diào)用render函數(shù),并且使用最新的數(shù)據(jù),來渲染界面

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

    this.state = {
      message: "Hello World"
    }
  }

  // 類中render函數(shù)的返回值, 就是要渲染到頁面的內(nèi)容
  render() {
    return (
      <div>
        <h2>{this.state.message}</h2>
        <button>改變文本</button>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

事件綁定

組件化問題二:事件綁定中的this

在類中直接定義一個(gè)函數(shù),并且將這個(gè)函數(shù)綁定到元素的onClick事件上,那么問題來了當(dāng)前這個(gè)函數(shù)中的this指向的是誰呢?

默認(rèn)情況下是undefined

很奇怪,居然是undefined;

因?yàn)樵谡5腄OM操作中,監(jiān)聽點(diǎn)擊,監(jiān)聽函數(shù)中的this其實(shí)是節(jié)點(diǎn)對象(比如說是button對象);

這次因?yàn)镽eact并不是直接渲染成真實(shí)的DOM,我們所編寫的button只是一個(gè)語法糖,它的本質(zhì)React的Element對象;

那么在這里發(fā)生監(jiān)聽的時(shí)候,react在執(zhí)行函數(shù)時(shí)并沒有綁定this,默認(rèn)情況下就是一個(gè)undefined;

我們在綁定的函數(shù)中,可能想要使用當(dāng)前對象,比如執(zhí)行 this.setState 函數(shù),就必須拿到當(dāng)前對象的this

我們就需要在傳入函數(shù)時(shí),需要給這個(gè)函數(shù)直接綁定this

類似于這種寫法: <button onClick={this.changeText.bind(this)}>改變文本</button>

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

    this.state = {
      message: "Hello World"
    }
  }

  btnClick() {
    // setState內(nèi)部會(huì)做兩件事情: 1.將state中的值改掉 2.自動(dòng)執(zhí)行render函數(shù)渲染頁面
    this.setState({
      message: "Hello React"
    })
  }

  render() {
    return (
      <div>
        <h2>{this.state.message}</h2>
        <button onClick={this.btnClick.bind(this)}>改變文本</button>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

如果有多個(gè)按鈕, 每次都需要編寫this.btnClick.bind(this)是比較麻煩的, 因此React中還有另一種常見的寫法, 在constructor在提前綁定this, 這樣就可以直接使用方法

這也是官方文檔在的做法

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

    this.state = {
      message: "Hello World"
    }
    // 為方法提前綁定this
    this.btnClick = this.btnClick.bind(this)
  }

  btnClick() {
    this.setState({
      message: "Hello React"
    })
  }

  render() {
    return (
      <div>
        <h2>{this.state.message}</h2>
        <button onClick={this.btnClick}>改變文本</button>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

其他案例練習(xí)

電影列表展示

定義一個(gè)數(shù)組中存放電影, 再對電影列表進(jìn)行展示

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

    this.state = {
      movies: ["大話西游", "黑話律師", "獨(dú)行月球"]
    }
  }

  render() {
    return (
      <div>
        <h2>電影列表</h2>
        <ul>
          <li>{this.state.movies[0]}</li>
          <li>{this.state.movies[1]}</li>
          <li>{this.state.movies[2]}</li>
        </ul>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

但是顯然目前這種方法是好的, 我們最好對movies進(jìn)行遍歷展示, 而遍歷的方式又有很多種, 先將下面兩種方式

方式一: 對movies數(shù)組遍歷放入一個(gè)新數(shù)組中

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

    this.state = {
      movies: ["大話西游", "黑話律師", "獨(dú)行月球"]
    }
  }

  render() {
    const liEls = []
    for (let item of this.state.movies) {
      const liEl = <li key={item}>{item}</li>
      liEls.push(liEl)
    }

    return (
      <div>
        <h2>電影列表</h2>
        <ul>
          {liEls}
        </ul>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

方式二: 使用map直接生成一個(gè)新數(shù)組, 直接將這個(gè)數(shù)組放入ul元素中

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

    this.state = {
      movies: ["大話西游", "黑話律師", "獨(dú)行月球"]
    }
  }

  render() {

    return (
      <div>
        <h2>電影列表</h2>
        <ul>
          {this.state.movies.map(item => <li key={item}>{item}</li>)}
        </ul>  
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

計(jì)數(shù)器的案例

接下來再使用React做一個(gè)熟悉的計(jì)數(shù)器案例

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

    this.state = {
      conter: 0
    }

    // 為方法綁定this
    this.increment = this.increment.bind(this)
    this.decrement = this.decrement.bind(this)
  }

  increment() {
    this.setState({
      conter: this.state.conter + 1
    })
  }

  decrement() {
    this.setState({
      conter: this.state.conter - 1
    })
  }

  render() {
    return (
      <div>
        <h2>{this.state.conter}</h2>
        <button onClick={this.increment}>+</button>
        <button onClick={this.decrement}>-</button>
      </div>
    )
  }
}

const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

到此這篇關(guān)于Hello React的組件化方式-React入門小案例的文章就介紹到這了,更多相關(guān)Hello React案例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React超詳細(xì)分析useState與useReducer源碼

    React超詳細(xì)分析useState與useReducer源碼

    我正在處理的組件是表單的時(shí)間輸入。表單相對復(fù)雜,并且是動(dòng)態(tài)生成的,根據(jù)嵌套在其他數(shù)據(jù)中的數(shù)據(jù)顯示不同的字段。我正在用useReducer管理表單的狀態(tài),到目前為止效果很好
    2022-11-11
  • React通過父組件傳遞類名給子組件的實(shí)現(xiàn)方法

    React通過父組件傳遞類名給子組件的實(shí)現(xiàn)方法

    React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫。這篇文章主要介紹了React通過父組件傳遞類名給子組件的方法,需要的朋友可以參考下
    2017-11-11
  • webpack入門+react環(huán)境配置

    webpack入門+react環(huán)境配置

    webpack是一個(gè)前端資源模塊化管理和打包工具,說白了就是方便我們管理自己的常用的一些代碼,比如你開發(fā)中用到sass以及jade同時(shí)用到es6,開發(fā)時(shí)你不可能改動(dòng)某個(gè)地方就挨個(gè)命令去轉(zhuǎn)換再到瀏覽器去看效果,那樣效率是非常低的。所以webpack幫我們省去了那些多余的步驟。
    2017-02-02
  • 使用React hook實(shí)現(xiàn)remember me功能

    使用React hook實(shí)現(xiàn)remember me功能

    相信大家在使用 React 寫頁面的時(shí)候都遇到過完成 Remember me 的需求吧!本文就將這個(gè)需求封裝在一個(gè) React hook 中以供后續(xù)的使用,覺得有用的同學(xué)可以收藏起來以備不時(shí)之需,感興趣的小伙伴跟著小編一起來看看吧
    2024-04-04
  • React在組件中如何監(jiān)聽redux中state狀態(tài)的改變

    React在組件中如何監(jiān)聽redux中state狀態(tài)的改變

    這篇文章主要介紹了React在組件中如何監(jiān)聽redux中state狀態(tài)的改變,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 關(guān)于React中的聲明式渲染框架問題

    關(guān)于React中的聲明式渲染框架問題

    這篇文章主要介紹了React中的聲明式渲染框架,我們先討論了命令式和聲明式這兩種范式的差異,其中命令式更加關(guān)注過程,而聲明式更加關(guān)注結(jié)果,對React渲染框架知識感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • React自定義視頻全屏按鈕實(shí)現(xiàn)全屏功能

    React自定義視頻全屏按鈕實(shí)現(xiàn)全屏功能

    這篇文章主要介紹了React自定義視頻全屏按鈕實(shí)現(xiàn)全屏功能,通過繪制全屏按鈕,并綁定點(diǎn)擊事件,編寫點(diǎn)擊事件,通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-11-11
  • react中的forwardRef 和memo的區(qū)別解析

    react中的forwardRef 和memo的區(qū)別解析

    forwardRef和memo是React中用于性能優(yōu)化和組件復(fù)用的兩個(gè)高階函數(shù),本文給大家介紹react中的forwardRef 和memo的區(qū)別及適用場景,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Vite+React+TypeScript手?jǐn)]TodoList的項(xiàng)目實(shí)踐

    Vite+React+TypeScript手?jǐn)]TodoList的項(xiàng)目實(shí)踐

    本文主要介紹了Vite+React+TypeScript手?jǐn)]TodoList的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • react-redux中connect()方法詳細(xì)解析

    react-redux中connect()方法詳細(xì)解析

    connect()是React-redux中的核心方法之一,它將react組件預(yù)redux中的Store真正連接在一起,下面這篇文章主要給大家介紹了react-redux中connect()方法的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05

最新評論