成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

React組件編寫思路(一)

CollinPeng / 2622人閱讀

摘要:受控組件例假設(shè)有一個(gè)方法非受控組件例接下來我們來看下如果編寫這兩種組件,打個(gè)比方我們要自定義一個(gè)組件。于是修改后的代碼如下確定使用這個(gè)組件的代碼以上就是兩種組件的編寫思路,你可以選擇把你的組件編寫成任意一種,那么使用者使用時(shí)也會(huì)有所不同。

新手寫 React 組件往往無從入手,怎么寫,什么時(shí)候用 props,什么時(shí)候用 state 摸不著頭腦。其實(shí)是沒有了解到 React 的一些思想。就我個(gè)人的經(jīng)驗(yàn)大多數(shù)的組件都有一定的套路可言,接下來就先介紹下 React 組件的基本思想。

React 組件可以分為可控組件和非可控組件??煽亟M件意思是組件自身控制自己的狀態(tài)(屬性),可以通過自身提供的方法(供調(diào)用者使用)來改變自己的狀態(tài)。譬如一個(gè) input text 輸入框提供一個(gè) reset 方法,如果要清空用戶輸入則通過獲得 inupt 組件對(duì)象,然后調(diào)用 reset 方法來做

refs.inputRef.rest() 。

非可控組件的意思是組件本身的狀態(tài)(屬性)自己無法更改,只能隨著外部傳入的值(props)而變化。還是拿輸入框清空這一個(gè)操作來說,非可控的 input 不通過自己提供方法來改變(維護(hù))自己的狀態(tài)(value),只通過外部傳入一個(gè)值為空字符串的 value 來做到清空的效果。

reset(){
  this.setState({
    inputValue: ""
  })
}
render(){
  return 
}

我們拿一個(gè)場景來看下完整的代碼(一個(gè) form 中有一個(gè) input,有一個(gè) reset 按妞,點(diǎn)擊 reset 按妞會(huì)清空用戶的輸入),看下這兩種組件書寫的區(qū)別。
受控組件例:

class App extends React.Component {
  reset = ()=>{
    this.refs.myInput.reset() // 假設(shè) input 有一個(gè) reset 方法
  }
  render() {
    
} }

非受控組件例:

class App extends React.Component {
  constructor( props ){
    super( props );
    this.state = {
      inputValue: "Plz input your text."
    }
  }
  reset = ()=>{
    this.setState( {
      inputValue: ""
    } )
  }
  render() {
    
} }

接下來我們來看下如果編寫這兩種組件,打個(gè)比方我們要自定義一個(gè) alert 組件。我們先從非受控組件說起,因?yàn)檩^簡單。非受控組件所要做的就是把所有狀態(tài)提取到組件的 props 中去,render 中就用 props。一個(gè) alert 有哪些最基本的狀態(tài)(屬性)呢?我們以最基礎(chǔ)的功能定出一個(gè)表示顯示與否的 show,一個(gè)表示顯示內(nèi)容的 content。那么組件代碼如下。

class Alert extends React.Component {
  constructor( props ) {
    super( props )
  }
  render() {
    let style = {
      display: this.props.show ? "fixed" : "none"
    }
    return (
      
Alert
{ this.props.content }
); } } Alert.propTypes = { show: React.PropTypes.bool, content: React.PropTypes.string }

我們看到最直觀的就是只需要考慮到 props 的可能取值就行,不需要關(guān)心如何改變props。而使用這個(gè)非可控 alert 的代碼如下:

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      alertMsg: "",
      showAlert: false
    }
    this.saveHandler = ()=>{
      // ajax success
      this.setState( {
        alertMsg: "Save successfully",
        showAlert: true
      } )
    }
  }

  render() {
    
} }

接下來我們看下可控組件的alert怎么寫??煽亟M件通過方法來供調(diào)用者來改變組件的狀態(tài)(屬性)。所以暫時(shí)我們不定義 props 只定義幾個(gè)方法 show(content), hide()。組件代碼如下:

class Alert extends React.Component {
  constructor( props ) {
    super( props )
    this.state = {
      content: "",
      show: false
    }
    this.show = ( content )=>{
      this.setState( {
        content: content,
        show: true
      } )
    }

    this.hide = ()=>{
      this.setState( {
        show: false
      } )
    }
  }
  render() {
    let style = {
      display: this.state.show ? "fixed" : "none"
    }
    return (
      
Alert
{ this.state.content }
); } }

我們看到可控組件內(nèi)部需要用到 state 來自己改變自己的狀態(tài)。使用這個(gè)可控 alert 的代碼如下:

import { Alert } from "Alert";

class App extends React.Component {
  constructor() {
    super();
    this.saveHandler = ()=>{
      // ajax success
      this.refs.myAlert.show( "Save Successfully" );
    }
  }

  render() {
    
} }

但是可控組件有一個(gè)問題就是他的初始化狀態(tài)如何設(shè)置(如何由外部定義組件 state 的初始化值)?由于沒有 props 那么只能通過方法來設(shè)置,那么這么做法很別扭。這時(shí)可以通過定義 props 把初始化狀態(tài)在生成這個(gè)組件時(shí)傳入,而不必等組件生成完再通過調(diào)用方法傳入。于是修改后的代碼如下:

class Alert extends React.Component {
  constructor( props ) {
    super( props )
    this.state = {
      content: this.props.defaultContent,
      show: this.props.defaultShow
    }
    this.show = ( content )=>{
      this.setState( {
        content: content,
        show: true
      } )
    }

    this.hide = ()=>{
      this.setState( {
        show: false
      } )
    }
  }

  render() {
    let style = {
      display: this.state.show ? "fixed" : "none"
    }
    return (
      
Alert
{ this.state.content }
); } } Alert.propTypes = { defaultShow: React.PropTypes.bool, defaultContent: React.PropTypes.string } Alert.defaultProps = { defaultShow: false, defaultContent: "" }

使用這個(gè)組件的代碼:

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      alertMsg: "",
      showAlert: false
    }
    this.saveHandler = ()=>{
      // ajax success
      this.refs.myAlert.show( "Save Successfully" );
    }
  }

  render() {
    
} }

以上就是兩種 React 組件的編寫思路,你可以選擇把你的組件編寫成任意一種,那么使用者使用時(shí)也會(huì)有所不同。但是作為一個(gè)具有良好可用性的組件,不應(yīng)該限制使用者的用法,那么下篇將介紹如何編寫一個(gè)既可以作為可控組件,也可以作為一個(gè)非可控組件的組件寫法。

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

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

相關(guān)文章

  • React組件編寫思路(二)

    摘要:那什么時(shí)候使用受控組件,什么時(shí)候使用非受控組件呢我們知道受控組件是比較符合我們傳統(tǒng)組件開發(fā)的思路的。故最基本的組件編寫套路就這些。 上一篇講了 React 兩種最常見的組件:受控組件和非受控組件。為了可用性,我們一般編寫出來的組件希望支持這兩種特性:可以通過組件自身的方法來改變組件的某(些)狀態(tài),也可以通過 props 的值的變化來改變組件自身的同一個(gè)(些)狀態(tài)。 組件改變自己的狀態(tài)只...

    Muninn 評(píng)論0 收藏0
  • 基于Decorator的React高階組件思路分析與實(shí)現(xiàn)

    摘要:在深入技術(shù)棧一書中,提到了基于的。書里對(duì)基于的沒有給出完整的實(shí)現(xiàn),在這里實(shí)現(xiàn)并記錄一下實(shí)現(xiàn)的思路。在這里最小的組件就是。對(duì)比范式與父組件的范式,如果完全利用來實(shí)現(xiàn)的,將操作與分離,也未嘗不可,但卻不優(yōu)雅。 在深入react 技術(shù)棧一書中,提到了基于Decorator的HOC。而不是直接通過父組件來逐層傳遞props,因?yàn)楫?dāng)業(yè)務(wù)邏輯越來越復(fù)雜的時(shí)候,props的傳遞和維護(hù)也將變得困難且冗...

    LinkedME2016 評(píng)論0 收藏0
  • 由重構(gòu)react組件引發(fā)的函數(shù)式編程的思考

    摘要:對(duì)于高階組件的使用場景如果有相關(guān)經(jīng)驗(yàn)的或者有不同的見解的希望能夠在我的博客下面留言最近在重構(gòu)組件時(shí),學(xué)習(xí)了一些高階組件的編寫思路,其實(shí)是由高階函數(shù)沿伸而來。 對(duì)于高階組件的使用場景如果有相關(guān)經(jīng)驗(yàn)的或者有不同的見解的希望能夠在我的博客下面留言 最近在重構(gòu)react組件時(shí),學(xué)習(xí)了一些高階組件的編寫思路,其實(shí)是由高階函數(shù)沿伸而來。一般情況我們編寫一個(gè)react組件大致樣子如下: class ...

    leone 評(píng)論0 收藏0
  • webpack+babel+react練習(xí)流程記錄

    摘要:簡介來構(gòu)建用戶界面的庫,不是框架關(guān)注于層虛擬單向數(shù)據(jù)流這些概念如何使用下載文件也可以使用,需要用到的模塊介紹是編寫組件的一種語法規(guī)范,可以看為是的擴(kuò)展,它支持將和混寫在一起,最后使用編譯為常規(guī)的,方便瀏覽器解析編寫第一個(gè)例子使用編寫組件 react簡介 來構(gòu)建用戶界面的庫,不是框架 關(guān)注于view層 虛擬DOM 單向數(shù)據(jù)流 JSX這些概念 如何使用react 下載文件 rea...

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

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

0條評(píng)論

CollinPeng

|高級(jí)講師

TA的文章

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