22 React高階組件

搭建服務端

yarn add express
yarn add nodemon
在server目錄下 npm init -y
// 增加dev腳本"scripts": {"dev": "nodemon ./index.js"},

引入

git

HOC

  • High Order Component 高階組件,是組件的抽象
  • HOC不是React提供的API,高級的設計模式
  • HOC是一個函數,接收一個組件參數,返回一個新組件
  • 普通組件返回的是UI,HOC返回的是一個新組件
  • HOC不能修改參數組件,只能傳入組件所需要的props(否則可能會導致參數組價內部的邏輯執行失效)
  • HOC是一個沒有副作用的純函數
  • HOC除了必須填入被包裹的組件參數以外,其余參數根據需求增加
  • HOC不關心數據如何使用,包裹組件不關心數據從哪來,只做渲染
  • HOC和包裹組件直接唯一的契合點是props

代碼

完整代碼
git

  • index15.jsx
import { fetchListData } from "./index15/front-end/model"
import { listHoc } from './index15/front-end/components/listHoc'import StudentList from './index15/front-end/components/StudentList'
import TeacherList from './index15/front-end/components/TeacherList'const StudentListHoc = listHoc(StudentList, fetchListData)
const TeacherListHoc = listHoc(TeacherList, fetchListData)class App extends React.Component {render() {return (<><StudentListHoc field='student' /><TeacherListHoc field='teacher' /></>)}
}
ReactDOM.render(<App />,document.getElementById('app')
)
  • listHoc .jsx
export function listHoc(WrapperComponent, fetchListData) {return class extends React.Component {state = {listData: []}remove = (id) => {this.setState({listData: this.state.listData.filter(item => item.id !== id)})}like = (id) => {this.setState({listData: this.state.listData.map(item => {if (item.id == id) {item.like = Number(item.like) + 1}return item})})}async componentDidMount() {const res = await fetchListData(this.props.field)this.setState({listData: res.data})}render() {return (<>{this.props.field === 'student' ?<WrapperComponentdata={this.state.listData}removeStudent={this.remove}></WrapperComponent>:<WrapperComponentdata={this.state.listData}likeTeacher={this.like}></WrapperComponent>}</>)}}
}

高階組件橫切關注點

  • 橫切關注點 → minxins
  • 對參數組件本身的邏輯狀態與視圖的橫向切割
  • 讓HOC來完成邏輯和狀態的管理
  • 讓參數組件來完成視圖的渲染
  • 讓HOC將數據與邏輯傳遞到參數組件中,從而完成關注點分離且有機結合的任務

柯里化

  • index.jsx
const StudentListHoc = listHoc(StudentList)(fetchListData)
const TeacherListHoc = listHoc(TeacherList)(fetchListData)
  • listHoc .jsx
export function listHoc(WrapperComponent) {return function (fetchListData) {return class extends React.Component {......}}
}

還可以在StudentList子組件內部返回listHoc(StudentList)

注意事項

有value就必須有onChange,否則使用defaultValue

  • 使用剩余參數去排除不需要的屬性
  • 對“HOC不能修改參數組件”的理解,例如,如下修改參數組件的生命周期函數
  • MyInput.jsx
export default class MyInput extends React.Component {componentDidUpdate() {console.log('MyInput更新')}render() {return (<div><h1>{this.props.inputValue}</h1><p>總計:{this.props.b + this.props.c}</p><inputtype="text"placeholder="請填寫"value={this.props.inputValue}onChange={this.props.valueInput}/></div>)}
}
  • InputHoc
export function InputHoc(WrapperComponent) {// 注意 如果在這里修重寫生命周期函數componentDidUpdate// WrapperComponent內的componentDidUpdate將不會被觸發// WrapperComponent.prototype.componentDidUpdate = () => {//     console.log('InputHoc內重寫componentDidUpdate')// }return class InputHocComponent extends React.Component {componentDidUpdate() {console.log('不重寫,都觸發')}state = {inputValue: ''}valueInput = (e) => {this.setState({inputValue: e.target.value})}render() {// 排除參數組件中不需要的屬性// 注意 剩余參數時變量名必須叫propsconst { a, ...props } = this.propsreturn (<WrapperComponentinputValue={this.state.inputValue}valueInput={this.valueInput}{...props}/>)}}
}
  • index.jsx
import MyInput from './index16/front-end/components/MyInput'
import { InputHoc } from './index16/front-end/components/InputHoc'
const MyInputHoc = InputHoc(MyInput)class App extends React.Component {state = {a: 1,b: 2,c: 3}render() {return (<><MyInputHoc {...this.state} /></>)}
}
ReactDOM.render(<App />,document.getElementById('app')
)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • MyInput使用函數組件
export default function MyInput(props) {return (<div><h1>{props.inputValue}</h1><p>總計:{props.b + props.c}</p><inputtype="text"placeholder="請填寫"value={props.inputValue}onChange={props.valueInput}/></div>)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PAT (Advanced Level) 1140~1143:1140模擬 1141模擬 1142暴力 1143 BST+LCA

1140 Look-and-say Sequence&#xff08;20 分&#xff09; 題意&#xff1a;觀察序列D, D1, D111, D113, D11231, D112213111, ...&#xff0c;顯然后一個串是對前一個串每一小段連續相同的字母及其個數的描述。例如&#xff0c;D112213111是對D11231的描述&#xff0c;原因是…

AngularJS:表達式

ylbtech-AngularJS&#xff1a;表達式1.返回頂部 1、AngularJS 表達式 AngularJS 使用 表達式 把數據綁定到 HTML。 AngularJS 表達式 AngularJS 表達式寫在雙大括號內&#xff1a;{{ expression }}。 AngularJS 表達式把數據綁定到 HTML&#xff0c;這與 ng-bind 指令有異曲同…

23 Refs的應用場景與選用思考

Refs含義 允許訪問真實DOMReact數據流&#xff1a;通過props來實現父子組件的交互Refs允許強制修改子組件 // 1. 構造器離添加實例屬性 this.ref React.createRef() // 2. 組件上綁定ref ref{this.ref} // 3. 使用&#xff1a;this.ref.currentinput class MyInput extends…

flutter --- Windows下環境配置

https://flutter.liulongbin.top/ https://www.cnblogs.com/zxsh/archive/2018/04/16/8859048.html

省選模擬賽記錄(越往下越新哦~~~)

LOG 模擬賽第一次見尼瑪這么給數據范圍的……開考有點困,迷迷糊糊看完了三道題,真的是像老呂說的那樣,一道都不會……思考T1,感覺有點感覺,但是太困了,就先碼了暴力,發現打表可以50分,于是就大力打了一波表……轉身T3,碼出25分的O(n^2)算法,然后不會了……去了T2,碼出35分的O(n…

MFC-CString與int互相轉化

1. CString轉int int n 0; CString str _T("123");n _ttoi(str); 2. int轉CString int n 0; CString str; str.Format(_T(%d) , n); 參考&#xff1a;MFC中 CString與int的轉化 vs2010 中 MFC::CString 如何和int相互轉化 轉載于:https://www.cnblogs.com/Tang-…

flutter --- 使用dio包

打開pubspec.yaml找到dependencies在最下面添加 dio: ^1.0.9ctrl s 之后,會自動下載依賴 使用: // get請求 import package:dio/dio.dart; Dio dio new Dio(); var response await dio.get("/test", data:{"id":12, "name":"marron&qu…

24 React.createRef()用法細節分析

通過React.createRef → ref對象通過元素的ref屬性可以附加到React元素上一般通過構造器中給this的屬性賦值一個ref&#xff0c;方便整個組件使用ref只要傳遞到react元素中&#xff0c;就可以利用ref的current屬性訪問到該真實DOM節點ref在componentDidMount和componentDidUpda…

對于下一代互聯網的暢想

去中心化 每臺客戶機都將成為服務器, 爭取對資源的充分利用 顯示屏化 運算功能交給云服務器, 每臺客戶機的主要任務是顯示 交互 聯網而不是進行運算, 爭取對資源的盡可能節省 優點 可以大大降低客戶機的成本, 減少資源的浪費, 而且使客戶機之間的區別變得更小(因為都主要負責顯…

npm install mysql --save-dev

npm install X: 會把X包安裝到node_modules目錄中不會修改package.json之后運行npm install命令時&#xff0c;不會自動安裝Xnpm install X –save: 會把X包安裝到node_modules目錄中 會在package.json的dependencies屬性下添加X 之后運行npm install命令時&#xff0c;會自動…

dart --- 環境配置

1.進入官網下載SDK http://www.gekorm.com/dart-windows/ 2.運行下載的EXE文件.下一步下一步… 3.打開小黑框,輸入: dart --version VSCode關于Dart的插件: DartCode Runner 插件安裝好后,需重啟VSCode. 新建 index.dart,輸入以下代碼 main () {print("Hello Dart…

Shiro 登錄、退出、校驗是否登錄涉及到的Session和Cookie

前提 我們的使用的是DefaultWebSessionManager而不是ServletContainerSessionManager。這就意味著前者的session為Shiro的&#xff0c;后者的session為Tomcat的。 登錄 DefaultWebSessionManager調用start()方法(在AbstractNativeSessionManager中)創建Session&#xff08;Simp…

25 Refs轉發機制與在高階組件中的使用

將子節點的ref暴露給父節點 16.3以上 Refs轉發&#xff0c;將ref自動通過組件傳遞給子組件 1. 在父組件創建ref對象 2. 給子組件賦值ref 3. 通過React.forward向子組件轉發ref屬性 4. 父組件的ref對象指向子組件dom 5. ref參數只有在 React.forwardRef 組件內定義時可接受con…

26 JSX深度剖析與使用技巧

React對JSX的處理 React.createElement有三個參數&#xff1a;標簽類型&#xff0c;屬性集合&#xff0c;子元素 JSX其實是React.createElement函數調用的語法糖 JSX → 編譯 → React.createElement調用形式 class App extends React.Component {render() {return (<div cl…

javascript --- 數組實用小技巧

一個數組:[a,b,c,d,e],希望滿足以下2個條件: 1.當索引在第0個位置的時候,數組為[b,c,d,e],在第1個位置的時候,數組為[a,c,d,e] … 2.若索引i 和 索引 j 的值相等,則只執行1次. 效果如下: nums [1,2,3,4] nums [1,1,1,2,2,3,4] 實現如下: let nums [1,1,1,2,2,3,4]; let le…

Http的持久連接和管線化

【要點】 1. 什么是持久連接&#xff1f; 2. 什么是管線化&#xff1f; 【總結】 1.什么是持久連接&#xff1f; (keep alive模式) HTTP1.1規定了默認保持長連接&#xff08;HTTP persistent connection &#xff0c;也有翻譯為持久連接&#xff09;;數據傳輸完成了保持TCP連接…

Hexo 版本

Mac hexo s 啟動Hexo服務報錯如下&#xff1a; Error: The module /usr/local/lib/node_modules/hexo-cli/node_modules/.0.8.0dtrace-provider/build/Release/DTraceProviderBindings.node was compiled against a different Node.js version using NODE_MODULE_VERSION 48. T…

dart --- 簡單的閉包

首先得明白下面2點: 全局變量的特點:常駐內存,污染全局變量局部變量的特點:會被垃圾回收機制回收,不會污染作用域… // 閉包.dart void main(){myClosure(){var a 0; // a是一個局部變量.函數執行完畢后將被清理return (){a;print(a);};}var fn myClosure();fn();fn();fn()…

27 JSX函數子元素的應用與思考

JSX的props.children和props本身有部分一致的特性 props.children可以傳遞任何類型的子元素 // 調用子元素回調 num 次&#xff0c;來重復生成組件 function Repeat(props) {// 返回一組JSXlet items [];for (let i 0; i < props.num; i) {items.push(props.children(i));…

Python學習day12(生成器,列表/生成器推導式)

Python學習day12(生成器&#xff0c;列表/生成器推導式) 生成器 初始生成器 我們知道的迭代器有兩種&#xff1a;一種是調用方法直接返回的&#xff0c;一種是可迭代對象通過執行iter方法得到的&#xff0c;迭代器有的好處是可以節省內存。 如果在某些情況下&#xff0c;我們也…