最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談React高階組件

 更新時(shí)間:2018年03月28日 09:10:25   作者:呆頭呆腦丶  
這篇文章主要介紹了淺談React高階組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前段時(shí)間在工作中寫(xiě)Hybrid頁(yè)面時(shí)遇到了這樣的一個(gè)場(chǎng)景,公司需要一系列的活動(dòng)組件,在每個(gè)組件注冊(cè)的時(shí)候都需要調(diào)用App端提供的一個(gè)接口。一開(kāi)始也考慮了幾種方式,包括mixin、組件繼承以及react高階組件。但經(jīng)過(guò)了種種衡量,最后選擇使用了高階組件的做法。

那什么是高級(jí)組件?首先你得先了解請(qǐng)求ES6中的class只是語(yǔ)法糖,本質(zhì)還是原型繼承。能夠更好的進(jìn)行說(shuō)明,我們將不會(huì)修改組件的代碼。而是通過(guò)提供一些能夠包裹組件的組件, 并通過(guò)一些額外的功能來(lái)增強(qiáng)組件。這樣的組件我們稱之為高階組件(Higher-Order Component)。

1、Mixins的缺點(diǎn)

React官方已不推薦使用Mixins的技術(shù)來(lái)實(shí)現(xiàn)代碼的重用,Mixins技術(shù)有一系列的缺點(diǎn),首先Mixins會(huì)造成命名沖突,我們通過(guò)以下的方式來(lái)注入Mixins:

var myMixins = require('myMixins');

var Button = React.createClass({
  mixins: [myMixins],
  
  // ...
})

如果你需要注入多個(gè)mixins,其中一個(gè)是自己的,另外的可能是第三方的。那有可能在兩個(gè)mixins里使用了相同名稱的方法,這會(huì)使得其中的一個(gè)不起作用,而你能做的只有修改其中一個(gè)方法的名稱。另一方面,一個(gè)mixins一開(kāi)始可能是非常簡(jiǎn)單的,僅僅需要實(shí)現(xiàn)某一個(gè)功能,但當(dāng)業(yè)務(wù)越加的復(fù)雜,需要往其中加入更多的方法的時(shí)候,就會(huì)變得非常復(fù)雜。要深入了解mixins的缺點(diǎn),可以查看官方博客。

2、組件繼承

對(duì)于我自己來(lái)說(shuō)這種方法以前使用的比較多,先創(chuàng)建一個(gè)BaseComponent,在其中實(shí)現(xiàn)一系列公共的方法,其后的每個(gè)組件都繼承于這個(gè)組件,但缺點(diǎn)是不夠靈活,在基礎(chǔ)組件中只能實(shí)現(xiàn)一些比較固定的方法,而對(duì)于每個(gè)組件的定制化會(huì)有很大的限制。

3、React高階組件

由于mixins的一系列缺點(diǎn),React官方也意識(shí)到使用mixins所帶來(lái)的痛點(diǎn)遠(yuǎn)遠(yuǎn)高于技術(shù)本身產(chǎn)生的優(yōu)點(diǎn),而高階組件便可以代替mixins,而且當(dāng)深入之后它還有著更加豐富的用法。

高階組件(HOC)是React中對(duì)組件邏輯進(jìn)行重用的高級(jí)技術(shù)。但高階組件本身并不是React API。它只是一種模式,這種模式是由React自身的組合性質(zhì)必然產(chǎn)生的。

高階函數(shù)

說(shuō)到高階組件,就先得說(shuō)到高階函數(shù)了,高階函數(shù)是至少滿足下列條件的函數(shù):

1、接受一個(gè)或多個(gè)函數(shù)作為輸入
2、輸出一個(gè)函數(shù)

在javascript這門(mén)函數(shù)為一等公民的語(yǔ)言中,高階函數(shù)的使用還是非常之多的,像我們平時(shí)的回調(diào)函數(shù)等等,都用到了高階函數(shù)的知識(shí)。我們先來(lái)看一個(gè)簡(jiǎn)單的高階函數(shù)

var fun = function(x, y) {
  return x + y;
}

fun是一個(gè)函數(shù),下面我們將整個(gè)函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)

var comp = function(x, y, f) {
  return f(x,y);
}

驗(yàn)證一下

comp(1,2,fun) // 3

高階組件定義

類比高階函數(shù)的定義,高階組件就是接受一個(gè)組件作為參數(shù),在函數(shù)中對(duì)組件做一系列的處理,隨后返回一個(gè)新的組件作為返回值。

我們先定義一個(gè)高階組件BaseActivity

const BaseActivity = (WrappedComponent) => {
 return class extends Component {
  render() {
   return (
    <section>
     <div>我的包裹組件</div>
     <WrappedComponent />
    </section>
    
   )
  }
 }
}

組件接受一個(gè)被包裹的組件作為參數(shù),返回了一個(gè)經(jīng)過(guò)處理的匿名組件。

在其他組件中使用這個(gè)高階組件

class Example extends React.PureComponent {
 constructor(props) {
  super(props);
  this.state = {
   width: '100%',
   height: '100%'
  }
 }

 componentWillMount() {
  if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
   return;
  } else {
   this.setState({
    width: '375px',
    height: '640px'
   })
  }
 }

 render() {
  let { width, height } = this.state;
  return (
   <div className="activity">
    <div className="activity-content" style={{ width, height }}>
     <button className="btn">參加活動(dòng)</button>
    </div>
   </div>
  )
 }
}

export default BaseActivity(Example);

具體用法就是在export 組件的時(shí)候,使用BaseActivity函數(shù)來(lái)包裹這個(gè)組件,看下輸出的react dom內(nèi)容


在Example組件外面包裹了一個(gè)匿名組件。

參數(shù)

既然高階組件是一個(gè)函數(shù),我們就可以向里面?zhèn)鬟f我們需要的參數(shù)

const BaseActivity = (WrappedComponent, title) => {
 return class extends Component {
  render() {
   return (
    <section>
     <div>{title}</div>
     <WrappedComponent />
    </section>
    
   )
  }
 }
}

在Example中這樣export

export default BaseActivity(Example, '這是高階組件的參數(shù)');

我們看下輸出的react dom


可以看到參數(shù)已經(jīng)傳遞進(jìn)去了。

當(dāng)然還可以這樣用(柯里化)

const BaseActivity (title) => (WrappedComponent) => {
 return class extends Component {
  render() {
   return (
    <section>
     <div>{title}</div>
     <WrappedComponent />
    </section>
    
   )
  }
 }
}

在Example中這樣export

export default BaseActivity('這是高階組件的參數(shù)')(Example);

這種用法在ant-design的表單以及redux的connect中我們都可以看到

// ant
const WrappedDemo = Form.create()(Demo)

// redux
export default connect(mapStateToProps, mapDispatchToProps)(Counter)

高階組件還可以擴(kuò)展原組件的props屬性,如下所示:

const BaseActivity (title) => (WrappedComponent) => {
 return class extends Component {
  render() {
   const newProps = {
     id: Math.random().toString(8)
   }
   return (
    <section>
     <div>{title}</div>
     <WrappedComponent {...this.props} {...newProps}/>
    </section>
   )
  }
 }
}

看下輸出的react dom


高階組件的缺點(diǎn)

高階組件也有一系列的缺點(diǎn),首先是被包裹組件的靜態(tài)方法會(huì)消失,這其實(shí)也是很好理解的,我們將組件當(dāng)做參數(shù)傳入函數(shù)中,返回的已經(jīng)不是原來(lái)的組件,而是一個(gè)新的組件,原來(lái)的靜態(tài)方法自然就不存在了。如果需要保留,我們可以手動(dòng)將原組件的方法拷貝給新的組件,或者使用hoist-non-react-statics之類的庫(kù)來(lái)進(jìn)行拷貝。

結(jié)語(yǔ)

高階函數(shù)對(duì)于初學(xué)者來(lái)說(shuō)可能不太好理解,但當(dāng)你深入其中,了解其中的原理之后,我們可以使用高階函數(shù)來(lái)完成很多的工作。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn)

    React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn)

    這篇文章主要介紹了React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • React.memo函數(shù)中的參數(shù)示例詳解

    React.memo函數(shù)中的參數(shù)示例詳解

    這篇文章主要為大家介紹了React.memo函數(shù)中的參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React useEffect使用教程

    React useEffect使用教程

    useEffect是react v16.8新引入的特性。我們可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合
    2022-10-10
  • react-router-dom?降低版本的兩種方法詳解

    react-router-dom?降低版本的兩種方法詳解

    這篇文章主要介紹了react-router-dom?降低版本的兩種方法,本篇文章就記錄下如何降低 react-router-dom 為 v5 版本的兩種方法,需要的朋友可以參考下
    2022-12-12
  • react ant Design手動(dòng)設(shè)置表單的值操作

    react ant Design手動(dòng)設(shè)置表單的值操作

    這篇文章主要介紹了react ant Design手動(dòng)設(shè)置表單的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • react-router6.x路由配置及導(dǎo)航詳解

    react-router6.x路由配置及導(dǎo)航詳解

    這篇文章主要介紹了react-router6.x路由配置及導(dǎo)航,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 在React中實(shí)現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在React中實(shí)現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在現(xiàn)代Web開(kāi)發(fā)中,處理和展示大量數(shù)據(jù)是一個(gè)常見(jiàn)的挑戰(zhàn),特別是在使用React框架時(shí),我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導(dǎo)出功能,本文將介紹如何在React中實(shí)現(xiàn)一個(gè)高效、分塊導(dǎo)出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下
    2024-12-12
  • 關(guān)于react中的常見(jiàn)錯(cuò)誤及解決

    關(guān)于react中的常見(jiàn)錯(cuò)誤及解決

    這篇文章主要介紹了關(guān)于react中的常見(jiàn)錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • ReactNative實(shí)現(xiàn)Toast的示例

    ReactNative實(shí)現(xiàn)Toast的示例

    這篇文章主要介紹了ReactNative實(shí)現(xiàn)Toast的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • React實(shí)現(xiàn)組件間通信的幾種方式小結(jié)

    React實(shí)現(xiàn)組件間通信的幾種方式小結(jié)

    在React應(yīng)用中,組件間的通信是一個(gè)基礎(chǔ)而關(guān)鍵的概念,理解和掌握不同組件之間的通信方式,可以幫助我們構(gòu)建出更加模塊化、可維護(hù)和可擴(kuò)展的應(yīng)用程序,React提供了多種組件通信的方法,本文給大家詳細(xì)的介紹了這些方法,需要的朋友可以參考下
    2024-07-07

最新評(píng)論

芒康县| 灵石县| 定边县| 灌南县| 怀宁县| 娄烦县| 西贡区| 濮阳市| 德安县| 叙永县| 名山县| 开封市| 庆云县| 池州市| 镇安县| 凤山市| 湛江市| 诏安县| 镇原县| 阳城县| 灯塔市| 合阳县| 泰顺县| 凌源市| 呼伦贝尔市| 沙田区| 仁化县| 北安市| 内乡县| 清苑县| 塘沽区| 闻喜县| 鱼台县| 广平县| 应用必备| 平乐县| 东乡县| 西吉县| 九龙坡区| 宝鸡市| 西昌市|