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

資訊專欄INFORMATION COLUMN

React 奇技淫巧 - defaultValue 和虛擬 dom diff 算法實(shí)現(xiàn)表單重置

paulquei / 2948人閱讀

摘要:根據(jù)虛擬的算法,只要改變節(jié)點(diǎn)的類型就能促使在的時(shí)候重新創(chuàng)建虛擬。不過(guò)這個(gè)效果依賴于虛擬算法。如果使用時(shí)候出現(xiàn)什么副作用,鄙人概不負(fù)責(zé)。此技巧在寫(xiě)文章時(shí)正處于的版本

我們知道 React 的標(biāo)準(zhǔn)模式是單向數(shù)據(jù)流,而其表單項(xiàng)通常需要監(jiān)聽(tīng) onChange 事件,然后通過(guò)改變外部的 value 來(lái)回寫(xiě)表單項(xiàng)的 value,譬如如下 input

class App extends React.Component {
  constructor( props ) {
    super( props );
    this.state = {
      inputValue: "default"
    }

    this.inputChangeHandler = ( e )=>{
      this.setState( {
        inputValue: e.target.value
      } );
    }
  }
  render() {
    return (
      
) } }

如果表單有很多表單項(xiàng),那么這種標(biāo)準(zhǔn)的做法需要你寫(xiě)很多個(gè) state 的屬性和很多個(gè) onChange 監(jiān)聽(tīng)函數(shù),這是一個(gè)體力活兒。但是一般的表單應(yīng)用其實(shí)不需要實(shí)時(shí)監(jiān)控表單項(xiàng)的用戶輸入,用 defaultValue 足以,在表單項(xiàng)目 onBlur 或者最后提交的時(shí)候一次驗(yàn)證獲取用戶輸入即可,譬如:

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

    this.submit = ( e )=>{
      let userInputValue = this.refs.userInput.value;
      // 1. 驗(yàn)證 userInputValue
      // 2. 提交表單
    }
  }
  render() {
    return (
      
) } }

這樣就可以少寫(xiě)不少代碼,當(dāng)然你可以寫(xiě)一些工具去批量添加所有的 onChange 事件監(jiān)聽(tīng)函數(shù)和對(duì)應(yīng)的 state 的屬性,譬如 redux-form。(回頭一想,這種寫(xiě)法在提交時(shí)候也需要寫(xiě)很多獲取用戶輸入的代碼,如果使用第一種正模式,那么提交時(shí)候只需要獲取 state 就可以了,不過(guò)這里先不討論這些)

對(duì)于一個(gè)表單而言,通常還需要重置功能(reset),如果是第一種正模式的寫(xiě)法,我們只要保存一份初始化的默認(rèn)值,在用戶點(diǎn)擊到了重置后,通過(guò) setState 設(shè)回去就行了。但是如果使用第二種 defaultValue 的寫(xiě)法,那么就沒(méi)有辦法了,因?yàn)?defaultValue 只在第一次創(chuàng)建虛擬 dom 的時(shí)候有作用,如果 dom 不改變你改變 defaultValue 是沒(méi)有用的。這個(gè)時(shí)候該怎么辦呢?

嘿嘿!這個(gè)時(shí)候我們就可以用到這個(gè)奇技淫巧了。既然 defaultValue 是在創(chuàng)建虛擬 dom 的時(shí)候有用,那么我們?cè)谟脩酎c(diǎn)擊重置的時(shí)候讓 React 重新創(chuàng)建這些表單項(xiàng)的虛擬 dom 不就好了么。根據(jù) React 虛擬 dom diff 的算法,只要改變 dom 節(jié)點(diǎn)的類型就能促使在 diff 的時(shí)候重新創(chuàng)建虛擬 dom。具體的寫(xiě)法我們就用代碼來(lái)演示下:

class App extends React.Component {
  constructor( props ) {
    super( props );
    // fieldSetWrapperType 是一個(gè)標(biāo)志位屬性,render 中會(huì)根據(jù)這個(gè)變量的值的不同,渲染不同的元素
    this.fieldSetWrapperType = "div";
    this.submit = ( e )=>{
      let userInputValue = this.refs.userInput.value;
      // 1. 驗(yàn)證 userInputValue
      // 2. 提交表單
    }
    this.reset = ()=>{
      // 點(diǎn)擊重置,改變標(biāo)志位
      this.fieldSetWrapperType = this.fieldSetWrapperType === "div" ? "section" : "div";
      // 強(qiáng)制刷新這個(gè)組件
      this.forceUpdate();
    }
  }
  // 把表單項(xiàng)的渲染抽象到一個(gè)方法中,避免重復(fù)編碼
  renderFieldSet() {
    return (
      
    );
  }
  render() {
    return (
      
{ /* 根據(jù) fieldSetWrapperType 值的不同,渲染不同的元素(表單項(xiàng)的 wrapper 元素) */ this.fieldSetWrapperType === "div" ?
{ this.renderFieldSet() }
:
{ this.renderFieldSet() }
}
) } }

思路就是在表單項(xiàng)外面包一層元素,每次點(diǎn)擊重置后改變一個(gè)變量,再?gòu)?qiáng)制刷新這個(gè)組件,組件根據(jù)這個(gè)變量不同的值把這個(gè)包裝元素的 type 改變,那么它下面的所有表單項(xiàng)的虛擬 dom 都會(huì)被重新創(chuàng)建,達(dá)到了重置的目的。不過(guò)這個(gè)效果依賴于 React 虛擬dom diff 算法。如果以后算法改變了,那么可能就失效了,而且這個(gè)寫(xiě)法是反模式的,我初衷是想在處理巨型表單時(shí)候少寫(xiě)點(diǎn)代碼偷懶用。如果使用時(shí)候出現(xiàn)什么副作用,鄙人概不負(fù)責(zé)。

此技巧在寫(xiě)文章時(shí) React 正處于 15.4.x 的版本

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

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

相關(guān)文章

  • React入門(mén)看這篇就夠了

    摘要:背景介紹入門(mén)實(shí)例教程起源于的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有框架,都不滿意,就決定自己寫(xiě)一套,用來(lái)架設(shè)的網(wǎng)站。做出來(lái)以后,發(fā)現(xiàn)這套東西很好用,就在年月開(kāi)源了。也就是說(shuō),通過(guò)鉤子函 react - JSX React 背景介紹 React 入門(mén)實(shí)例教程 React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有 JavaScript MVC 框架,都不滿意,就決定自己寫(xiě)一套...

    luckyw 評(píng)論0 收藏0
  • 常見(jiàn)react面試題匯總(適合中級(jí)前端)

    摘要:但在中會(huì)有些不同,包含表單元素的組件將會(huì)在中追蹤輸入的值,并且每次調(diào)用回調(diào)函數(shù)時(shí),如會(huì)更新,重新渲染組件。在構(gòu)造函數(shù)中調(diào)用的目的是什么在被調(diào)用之前,子類是不能使用的,在中,子類必須在中調(diào)用。將使用單個(gè)事件監(jiān)聽(tīng)器監(jiān)聽(tīng)頂層的所有事件。 已經(jīng)開(kāi)源 地址:https://github.com/nanhupatar...關(guān)注我們團(tuán)隊(duì):showImg(https://segmentfault.co...

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

    摘要:基礎(chǔ)創(chuàng)建虛擬參數(shù)元素名稱,例如參數(shù)屬性集合,例如,,,從參數(shù)開(kāi)始,表示該元素的子元素,通常這些元素通過(guò)創(chuàng)建,文本文件可以直接插入嘻嘻哈哈這是渲染器,將元素渲染到頁(yè)面中。 React簡(jiǎn)介 FeceBook開(kāi)源的一套框架,專注于MVC的視圖V模塊。實(shí)質(zhì)是對(duì)V視圖的一種實(shí)現(xiàn)。 React框架的設(shè)計(jì)沒(méi)有過(guò)分依賴于某個(gè)環(huán)境,它自建一套環(huán)境,就是virtual DOM(虛擬DOM)。 提供基礎(chǔ)AP...

    hlcc 評(píng)論0 收藏0
  • react虛擬dom機(jī)制與diff算法

    摘要:的一個(gè)突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是研發(fā)團(tuán)隊(duì)弄出的虛擬機(jī)制以及其獨(dú)特的算法。在的算法下,在同一位置對(duì)比前后節(jié)點(diǎn)只要發(fā)現(xiàn)不同,就會(huì)刪除操作前的節(jié)點(diǎn)包括其子節(jié)點(diǎn),替換為操作后的節(jié)點(diǎn)。 React的一個(gè)突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是facebook研發(fā)團(tuán)隊(duì)弄出的虛擬dom機(jī)制以及其獨(dú)特的diff算法。下面簡(jiǎn)單解釋一下react虛擬dom機(jī)制和diff算法的實(shí)現(xiàn)...

    jzman 評(píng)論0 收藏0
  • 從Preact了解一個(gè)類React的框架是怎么實(shí)現(xiàn)的(二): 元素diff

    摘要:本系列文章將重點(diǎn)分析類似于的這類框架是如何實(shí)現(xiàn)的,歡迎大家關(guān)注和討論。作為一個(gè)極度精簡(jiǎn)的庫(kù),函數(shù)是屬于本身的。 前言   首先歡迎大家關(guān)注我的掘金賬號(hào)和Github博客,也算是對(duì)我的一點(diǎn)鼓勵(lì),畢竟寫(xiě)東西沒(méi)法獲得變現(xiàn),能堅(jiān)持下去也是靠的是自己的熱情和大家的鼓勵(lì)。  之前分享過(guò)幾篇關(guān)于React的文章: React技術(shù)內(nèi)幕: key帶來(lái)了什么 React技術(shù)內(nèi)幕: setState的秘密...

    張巨偉 評(píng)論0 收藏0

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

0條評(píng)論

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