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

React Component存在的幾種形式詳解

 更新時(shí)間:2018年11月06日 08:56:50   作者:Helkyle  
這篇文章主要給大家介紹了關(guān)于React Component存在的幾種形式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近項(xiàng)目基本都是用 React,今天總結(jié)分享 React Component 常見(jiàn)的幾種形式,如果你在寫(xiě) React 時(shí)經(jīng)常不知道怎么拆分代碼,這篇文章或許對(duì)你有所幫助。

React.Component是一個(gè)抽象基類(lèi)。這意味著直接引用React.Component是毫無(wú)意義的。你可以實(shí)現(xiàn)一個(gè)它的子類(lèi),并且至少定義一個(gè)render()方法即可使用。

為了更充分理解 React,先搞懂平時(shí)寫(xiě)的 JSX 是什么。初學(xué)的時(shí)候有比較大困惑,這是一門(mén)新語(yǔ)言嗎?大部分人是匆匆掃過(guò)文檔就開(kāi)始開(kāi)發(fā)。通過(guò) babel-presets-react 處理能看到,其實(shí) JSX 只是語(yǔ)法糖,最終在瀏覽器跑的還是 JS。React Component 最終都通過(guò) React.createElement 創(chuàng)建。 總之,寫(xiě) React 其實(shí)就是在寫(xiě) JS 。


SFC (Stateless Functional Component)

React 可以使用 Function 來(lái)創(chuàng)建 Component,這類(lèi) Component 沒(méi)有 lifecycle, 內(nèi)部不維護(hù) state,只要傳入的 props 有變化則進(jìn)行重新渲染。

function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}

用箭頭函數(shù)的寫(xiě)法還更加簡(jiǎn)潔。

const Welcome = props => <h1>Hello, {props.name}</h1>;

上面兩種形式生成 es5 代碼都是一樣的。

var Welcome = function Welcome(props) {
return _react2.default.createElement(
"h1",
null,
"Hello, ",
props.name
);
};

SFC 的特點(diǎn)是純粹只做 render,代碼簡(jiǎn)短沒(méi)有其他條件分支,并且相比 class Component 編譯后的代碼量會(huì)少一些。

尷尬的是,在 React 16.7 react hooks 出來(lái)之后,SFC 這個(gè)名字有歧義了,因?yàn)橛蒙?useState,SFC 也可以有 local state, 同樣可以擁有 lifecycle。再稱(chēng)之為 Stateless Components 就很尷尬,改名叫 FC ?

HOC (Higher-Order Components)

高階組件對(duì)于 Vue 開(kāi)發(fā)者來(lái)說(shuō)應(yīng)該是個(gè)陌生的概念(不知道,我用 Vue 的時(shí)候沒(méi)見(jiàn)過(guò)類(lèi)似的用法)。從代碼上看,高階組件就是一個(gè)方法,傳入一個(gè)組件,返回另一個(gè)組件。

function logProps(WrappedComponent) {
return class extends React.Component {
componentWillReceiveProps(nextProps) {
console.log('Current props: ', this.props);
console.log('Next props: ', nextProps);
}
render() {
return <WrappedComponent {...this.props} />;
}
}
}

最常見(jiàn)的高階組件是 react-redux 里面的 connect 方法,通過(guò)傳入 組件和 map*ToProps 方法,讓組件和 store 連接。組件內(nèi)部就可以直接通過(guò) props 獲得 connect 之后的值。

exprot default connect(
mapStateToProps,
mapDispatchToProps,
)(Component);

高階組件適合用來(lái)擴(kuò)展功能,把這部分功能從業(yè)務(wù)組件中抽離出來(lái),需要的套上,不需要的時(shí)候移除,對(duì)被包裹組件侵入性非常小。

Dynamic Component

有些業(yè)務(wù)場(chǎng)景下,在執(zhí)行時(shí)才能確定具體的標(biāo)簽或者組件是什么。在 React 的世界里面,以大寫(xiě)字母開(kāi)頭會(huì)被當(dāng)成動(dòng)態(tài)組件加載,而小寫(xiě)字母開(kāi)頭會(huì)被認(rèn)為是 HTML DOM tag。

// Heading.js
render() {
const { tag: Tag, children } = this.props;
return <Tag>{ children }</Tag>
}

根據(jù)萬(wàn)物皆為 JS 理論,只要傳入不同的 tag 標(biāo)簽,就會(huì)渲染出不同的 heading 標(biāo)簽。


我們常用這種方式,在后端配置組件和數(shù)據(jù),前端讀取配置之后渲染出對(duì)應(yīng)的內(nèi)容。

FaCC(Functions as Child Components)

React children 還可以是 Function 類(lèi)型,如果直接調(diào)用它會(huì)什么寫(xiě)法?

比如封裝一個(gè) Loading 組件,會(huì)給 children 提供 loading 參數(shù),業(yè)務(wù)組件再根據(jù) loading 判斷需要 render 什么內(nèi)容。

class LoadArea extends Component {
state = {
loading: true,
};

componentDidMount() {
asyncFunc()
.then(() => {
this.setState({
loading: false,
})
})
.catch(() => {
this.setState({
loading: false,
})
})
}

render() {
return (
<React.Fragment>
{this.props.children({
...this.props,
...this.state,
})}
</React.Fragment>
);
}
}

用法

render() {
<LoadingArea>
({ loading }) => {
loading
? <Wating />
: <Main />
}
</LoadingArea>
}

同樣的,最終執(zhí)行時(shí)都是 JS,沒(méi)有什么好奇怪的。

React 16.* 新版本的 Conext.Consumer 就是采用了這種寫(xiě)法。

render() {
<ThemeContext.Provider value={this.state.theme}>
...
<ThemeContext.Consumer>
{({theme}) => (
<button
style={{backgroundColor: theme.background}}>
Toggle Theme
</button>
)}
</ThemeContext.Consumer>
...
</ThemeContext.Provider> 
}

再以最近開(kāi)發(fā)的例子,分享組件拆分的好處。

需求:開(kāi)發(fā)倒計(jì)時(shí)組件,運(yùn)營(yíng)配置倒計(jì)時(shí)結(jié)束時(shí)間,倒計(jì)時(shí)初始化時(shí)間從服務(wù)端獲取,結(jié)束之前顯示倒計(jì)時(shí),倒計(jì)時(shí)結(jié)束之后做對(duì)應(yīng)的操作,比如切換倒計(jì)時(shí)為其他組件。

組件拆分:

  • 一個(gè)業(yè)務(wù)層容器組件,負(fù)責(zé)統(tǒng)籌,處理業(yè)務(wù)邏輯。
  • 一個(gè)通用‘倒計(jì)時(shí)'的組件,向服務(wù)端輪詢(xún)系統(tǒng)時(shí)間,計(jì)算當(dāng)前剩余時(shí)間,F(xiàn)aCC 的形式提供給 children。
  • 一個(gè)倒計(jì)時(shí)UI組件,對(duì)剩余時(shí)間格式化以及 UI 展示。

偽代碼:

// CountDownContainer.js
render() {
const {
endTime,
renderSomethingAfterCountDown,
} = this.props;

return (
<TimeLeftProvider endTime={endTime} >
{seconds => (
seconds > 0
? <CountDown {...this.props} remainingSeconds={seconds} />
: renderSomethingAfterCountDown()
)}
</TimeLeftProvider>
);
}
// TimeLeftProvider.js
export default class TimeLeftProvider extends PureComponent {
static propTypes = {
children: PropTypes.func,
endTime: PropTypes.number,
}

// ...

componentDidMount() {
this.poll();
}

poll() {
queryServerTime();
this.pollTimer = setInterval(() => {
queryServerTime();
}, pollInterval * 1000);
}

countDown() {
setInterval(() => {
this.setState(prevState => ({
remainingSeconds: prevState.remainingSeconds - 1,
}));
}, 1000);
}

render() {
const { remainingSeconds, reliable } = this.state;
return this.props.children(remainingSeconds, reliable);
}
}
// CountDown.js

function CountDown(props) {
const {
remainingSeconds,
} = props;
const numbers = formatSeconds(remainingSeconds);
const inputs = ['days', 'hours', 'minutes', 'seconds'];

return (
<div styleName={cls}>
{
inputs.map(key => ({
label: key,
number: numbers[key],
})).map(
//...
)
}
</div>
);
}

最終得到的結(jié)果是:


與此同時(shí)

  • 代碼結(jié)構(gòu)清晰,組件之間各司其職。
  • 組件可復(fù)用性強(qiáng)。
  • 單元測(cè)試簡(jiǎn)單,每個(gè)組件都只測(cè)試自身的邏輯。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • react中的雙向綁定你真的了解嗎

    react中的雙向綁定你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了react中的雙向綁定,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • React?Fiber原理深入分析

    React?Fiber原理深入分析

    Fiber可以理解為一個(gè)執(zhí)行單元,每次執(zhí)行完一個(gè)執(zhí)行單元,React?Fiber就會(huì)檢查還剩多少時(shí)間,如果沒(méi)有時(shí)間則將控制權(quán)讓出去,然后由瀏覽器執(zhí)行渲染操作,這篇文章主要介紹了React?Fiber架構(gòu)原理剖析,需要的朋友可以參考下<BR>
    2023-01-01
  • 基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面的實(shí)例代碼

    基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面的實(shí)例代碼

    這篇文章主要介紹了基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 一文帶你搞懂React中的useReducer

    一文帶你搞懂React中的useReducer

    useReducer 是除useState之外另一個(gè)與狀態(tài)管理相關(guān)的 hook,這篇文章主要為大家介紹了useReducer應(yīng)用的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • useCallback和useMemo的正確用法詳解

    useCallback和useMemo的正確用法詳解

    這篇文章主要為大家介紹了useCallback和useMemo的正確用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React實(shí)現(xiàn)輪播圖效果

    React實(shí)現(xiàn)輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)輪播圖效果,使用react-slick組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • React Native Popup實(shí)現(xiàn)示例

    React Native Popup實(shí)現(xiàn)示例

    本文主要介紹了React Native Popup實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • React如何動(dòng)態(tài)控制偽元素樣式

    React如何動(dòng)態(tài)控制偽元素樣式

    這篇文章主要介紹了React如何動(dòng)態(tài)控制偽元素樣式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    這篇文章主要介紹了詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 關(guān)于React狀態(tài)管理的三個(gè)規(guī)則總結(jié)

    關(guān)于React狀態(tài)管理的三個(gè)規(guī)則總結(jié)

    隨著 JavaScript 單頁(yè)應(yīng)用開(kāi)發(fā)日趨復(fù)雜,JavaScript 需要管理比任何時(shí)候都要多的 state (狀態(tài)),這篇文章主要給大家介紹了關(guān)于React狀態(tài)管理的三個(gè)規(guī)則,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

富源县| 泊头市| 丘北县| 剑川县| 江都市| 蒲城县| 青岛市| 合川市| 太原市| 吴桥县| 监利县| 玛多县| 西和县| 海阳市| 敦煌市| 淄博市| 枣阳市| 黎川县| 开原市| 来凤县| 岳西县| 江永县| 梓潼县| 河源市| 庄浪县| 名山县| 南汇区| 邢台县| 岑巩县| 邛崃市| 泗阳县| 漠河县| 广南县| 清河县| 颍上县| 巴青县| 济南市| 高陵县| 新民市| 桃源县| 静安区|