摘要:有狀態(tài)組件通常使用和生命周期相關(guān)事件。組件模式是使用時的最佳實(shí)踐,最初引入組件模式是為了將數(shù)據(jù)邏輯和表現(xiàn)層進(jìn)行分離。這是一種可以對輸入組件的進(jìn)行修改增刪改查然后返回全新的修改后的組件強(qiáng)大模式,想想和。
想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!
組件是 React 的核心,因此了解如何利用它們對于創(chuàng)建優(yōu)秀的設(shè)計(jì)結(jié)構(gòu)至關(guān)重要。
什么是組件根據(jù) React 官網(wǎng)的介紹,“組件讓你可以將 UI 分割成獨(dú)立的、可重用的部分,并獨(dú)立管理每個部分。”
當(dāng)你第一次安裝 npm install react 時,會得到一件事:組件及其 API。與 JavaScript 函數(shù)類似,組件接受名為 “props” 的輸入并返回 React 元素,該元素描述(聲明)用戶界面(UI)的外觀。這就是為什么 React 被稱為聲明性 API,因?yàn)槟愀嬖V它你希望 UI 是什么樣子的,而 React 負(fù)責(zé)其余的工作。
可以把聲明式想像成當(dāng)打的去一個目的地時,只需要告訴司機(jī)去哪里,他就會開車把你送到那里。命令式編程正好相反—,你得自己駕車到那里。
組件的 API當(dāng)安裝 React 后,便可以使用 React 提供的 API,基本可以分成 5 種。
render
state
props
context
lifecycle events
盡管一個組件可以使用上述所有 API,但一個組件通常用到只有少數(shù)幾個 API,而其他組件則只使用其他 API。
可以對組件使用不同的 API 對組件進(jìn)行劃分,分為 有狀態(tài)(stateful) 和 無狀態(tài)(stateless) 兩種組件。
有狀態(tài)組件通常使用 API: render, state 和生命周期相關(guān)事件。
無狀態(tài)組件通常使用 API: render, props 和 context。
以上就是我們?yōu)槔幸榻B 組件模式 的原因。組件模式是使用 React 時的最佳實(shí)踐,最初引入組件模式是為了將數(shù)據(jù)邏輯和 UI 表現(xiàn)層進(jìn)行分離。通過在組件之間劃分職責(zé),您以創(chuàng)建更多可重用的、內(nèi)聚的組件,這些組件可用于組合復(fù)雜的 UI,這在構(gòu)建可擴(kuò)展的應(yīng)用程序時尤其重要。
組件模式通常組件模式有以下幾種:
Container (容器組件)
Presentational (展示組件)
Higher order components (高級組件)
Render callback (渲染回調(diào))
Container (容器組件)“容器組件就是取數(shù)據(jù),然后渲染子組件而已” —— Jason Bonta
容器組件是你的數(shù)據(jù)或邏輯層并利用 stateful API,使用生命周期事件,你可以連接 state 到
redux 或者 Flux 的 storage 中,并將數(shù)據(jù)和回調(diào)作為 props 傳遞給子組件。
在容器組件的 render 方法中,你可以使用 展示組件 來渲染具體的樣式。為了能夠訪問到所有狀態(tài) API,容器組件必須使用 class 的方式聲明,而不是使用函數(shù)式方法聲明。
在下面的示例中,我們有一個名為 Greeting 的類組件,它具有狀態(tài),生命周期事件componentDidMount() 和 render 方法。
class Greeting extends React.Component { constructor() { super(); this.state = { name: "", }; } componentDidMount() { // AJAX this.setState(() => { return { name: "William", }; }); } render() { return (); } }Hello! {this.state.name}
此時,該組件是一個有狀態(tài)類組件,為了使 Greeting 成為一個容器組件,我們可以將 UI 拆分為一個 展示組件,將在下面進(jìn)行說明。
展示組件展示組件 使用 props、render 和 context (無狀態(tài)API),并且由于不需要使用生命周期相關(guān) Api,可以使用純函數(shù)來簡化表述它們:
const GreetingCard = (props) => { return () }Hello! {props.name}
展示組件 僅從 props 接收數(shù)據(jù)和回調(diào),這些數(shù)據(jù)和回調(diào)可以由其容器組件(父組件)提供。
容器組件和展示組件各自將數(shù)據(jù)/邏輯和展示部分封裝到各自的組件中:
const GreetingCard = (props) => { return () } class Greeting extends React.Component { constructor() { super(); this.state = { name: "", }; } componentDidMount() { // AJAX this.setState(() => { return { name: "William", }; }); } render() { return ({props.name}
); } }
如你所見,已經(jīng)將 Greeting 組件中展示相關(guān)的部分移動到了它自己的函數(shù)式展示組件中。當(dāng)然,這是一個非常簡單的例子——對于更復(fù)雜的應(yīng)用程序,這也是最基本的。
高階組件高階組件是一種函數(shù),它接受一個組件作為參數(shù),然后返回一個新的組件。
這是一種可以對輸入組件的 props 進(jìn)行修改(增刪改查)然后返回全新的修改后的組件強(qiáng)大模式,想想 react-router-v4 和 redux 。用了 react-router-v4 后,你可以使用 withRouter() 來繼承以 props 形式傳遞給組件的各種方法。同樣,用了redux,就可以使用 connect({})() 方法來將展示組件和 store 中的數(shù)據(jù)進(jìn)行連接。
代碼演示:
import {withRouter} from "react-router-dom"; class App extends React.Component { constructor() { super(); this.state = {path: ""} } componentDidMount() { let pathName = this.props.location.pathname; this.setState(() => { return { path: pathName, } }) } render() { return () } } export default withRouter(App);Hi! I"m being rendered at: {this.state.path}
導(dǎo)出組件時,使用用 react-router-v4 的 withRouter()方法封裝它。 在 組件 App 的生命周期事件 componentDidMount() 方法中,我們使用this.props.location.pathname 提供的值來更新 state。 由于我們使用了 withRouter 高階組件,我們可以直接訪問 this.props.locationlocation,而不需要直接將 location 作為 props 直接傳入,非常方便。
渲染回調(diào)與高階組件類似,渲染回調(diào)或渲染 props 被用于共享或重用組件邏輯。雖然許多開發(fā)人員傾向于使用 高階組件 的可重用邏輯,但是使用 渲染回調(diào) 仍然有一些非常好的理由和優(yōu)勢——這是在 Michael Jackson 的“永不寫另一個高階組件”中得到了最好的解釋。簡而言之,渲染回調(diào)減少了命名空間沖突,并更好的說明了邏輯來源。
class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment = () => { this.setState(prevState => { return { count: prevState.count + 1, }; }); }; render() { return ({this.props.children(this.state)}); } } class App extends React.Component { render() { return ({state => ( ); } })}The count is: {state.count}
在 Counter 類中,在 render 方法中嵌入 this.props.children 并將 this.state 作為參數(shù)。在 App 類中,我們可以將我們組件封裝在 Counter 組件中,因此我可以操作 Counter 組件內(nèi)的邏輯。
Counter 組件的本質(zhì)是暴露了 children 這個外部屬性,將 children 具體的渲染細(xì)節(jié)交個 Counter 的使用者,使用的時候只需要將組件傳入到 Counter 的 children 中,當(dāng)然可以使用其他參數(shù),如果 children 不夠的話。
代碼部署后可能存在的BUG沒法實(shí)時知道,事后為了解決這些BUG,花了大量的時間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具 Fundebug。
原文:
https://medium.com/teamsubcha...
你的點(diǎn)贊是我持續(xù)分享好東西的動力,歡迎點(diǎn)贊!
歡迎加入前端大家庭,里面會經(jīng)常分享一些技術(shù)資源。文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101856.html
摘要:本篇是深入系列的最后一篇,將介紹開發(fā)應(yīng)用時,經(jīng)常用到的模式,這些模式并非都有官方名稱,所以有些模式的命名并不一定準(zhǔn)確,請讀者主要關(guān)注模式的內(nèi)容。 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項(xiàng)目中更加靈活地使用React。 本篇是React深入系列的最后一篇,將介紹開發(fā)React應(yīng)用時,經(jīng)常用到的模式,這些模式并非都有...
摘要:此時,我將它寫下來討論和分享這些我發(fā)現(xiàn)的模式。正確的姿勢應(yīng)該是通過的方式獲取子組件的一些信息。高階組件是需要另外一個有用的模式依賴注入。也有部分人稱它是一種模式。最直接的方式是通過每一層通過來傳遞。 原文出自:http://krasimirtsonev.com/blog/article/react-js-in-design-patterns 前言 我想找一個好的前端前端框架,找了很久。...
摘要:單向數(shù)據(jù)流應(yīng)用的核心設(shè)計(jì)模式,數(shù)據(jù)流向自頂向下我也是性子急的人,按照技術(shù)界的慣例,在學(xué)習(xí)一個技術(shù)前,首先得說一句。然而的單向數(shù)據(jù)流的設(shè)計(jì)讓前端定位變得簡單,頁面的和數(shù)據(jù)的對應(yīng)是唯一的我們可以通過定位數(shù)據(jù)變化就可以定位頁面展現(xiàn)問題。 書籍完整目錄 1.1 React 介紹 showImg(https://segmentfault.com/img/bVvJgS); 1.1.1 React ...
摘要:近兩年來一直在關(guān)注開發(fā),最近也開始全面應(yīng)用。首先,我們從無狀態(tài)組件開始。渲染回調(diào)模式有一種重用組件邏輯的設(shè)計(jì)方式是把組件的寫成渲染回調(diào)函數(shù)或者暴露一個函數(shù)屬性出來。最后,我們將這個回調(diào)函數(shù)的參數(shù)聲明為一個獨(dú)立的類型。 近兩年來一直在關(guān)注 React 開發(fā),最近也開始全面應(yīng)用 TypeScript 。國內(nèi)有很多講解 React 和 TypeScript 的教程,但如何將 TypeScri...
閱讀 2073·2021-11-24 09:39
閱讀 788·2021-09-30 09:48
閱讀 980·2021-09-22 15:29
閱讀 2415·2019-08-30 14:17
閱讀 1891·2019-08-30 13:50
閱讀 1343·2019-08-30 13:47
閱讀 982·2019-08-30 13:19
閱讀 3423·2019-08-29 16:43