摘要:在列表的渲染中不推薦使用循環(huán)的下標作為在列表的渲染中,如果對列表某條數(shù)據(jù)刪除會改變其上下的組件的改變增大組件的復用性
React 有關使用包
使用官方提供的react腳手架搭建的小型項目:create-react-app
react中使用路由react-router-dom
單向數(shù)據(jù)流使用的是redux,通過redux-thunk中間件實現(xiàn)異步操作
使用單向數(shù)據(jù)流與路由中,通過props逐級傳遞有點麻煩,性能不佳,使用中間件形式的react-redux構造裝飾器,可以訪問全局數(shù)據(jù)流
在react項目中還是用了懶加載react-loadable
import Loadable from "react-loadable" const Loading = ({ //自定義公用加載時頁面 pastDelay, timedOut, error }) => { if(pastDelay) { return ; } else if(timedOut) { returnreact中的生命周期Taking a long time...; } else if(error) { returnError!; } return null; } //路由中頁面 懶加載 view const MusicIndex = Loadable({ loader: () => import("./component/MusicIndex/MusicIndex"), loading: Loading, timeout: 10000 })
# react 的基本組件生命周期如下 1. constructor 組件的構造函數(shù):接受父組件的參數(shù),初始化state,綁定函數(shù)等等的操作 2. componentWillMount 組件渲染之前,每次組件渲染都會觸發(fā)一次 3. componentDidMount 組件渲染之后,每次組件渲染都會觸發(fā)一次,子組件都掛載好,可以使用refs,可以使用異步方法,防止阻塞UI 4. componentWillReceiveProps 該函數(shù)接收到新的props才會被調(diào)用,render不會觸發(fā)該函數(shù) 5. shouldComponentUpdate 在組件接收到新的props或者state時被調(diào)用。在初始化時或者使用forceUpdate時不被調(diào)用。 6. componentWillUpdate 該函數(shù)接收到新的props或者state與render之前才會被調(diào)用,初始化不會觸發(fā)該函數(shù) 7. componentDidUpdate 該函數(shù)在組件完成更新后立即調(diào)用。在初始化時不會被調(diào)用。 8. componentWillUnmount 該函數(shù)為組件被移除(卸載)時被調(diào)用 class App extends Component { constructor(props) { super(props) } componentWillMount(){} componentDidMount() {} componentWillReceiveProps(newProps) {} shouldComponentUpdate(newProps, newState) { return true; } componentWillUpdate(nextProps, nextState) {} componentDidUpdate(prevProps, prevState) {} componentWillUnmount() {} render() { return(react中使用路由展示APP頁面); } }
import { HashRouter as Router, Route, Link } from "react-router-dom" import { MusicIndex } from "./../MusicIndex.js" import { MusicRanking } from "./../MusicRanking.js" import { MusicCollection } from "./../MusicCollection.js" import { MusicPersonal } from "./../MusicPersonal.js" render() { return(react中使用單向數(shù)據(jù)流redux); } 頁面一 頁面二 頁面三 頁面四
redux分為3各部分
store :數(shù)據(jù),store全局僅有唯一的store
action: 操作,通過觸發(fā)action改變store的狀態(tài),stroe的狀態(tài)不能不能直接修改
Reducers 執(zhí)行,通過action反饋的操作去執(zhí)行,直接修改store的狀態(tài)
redux 在大型項目中可與 vuex 一樣實現(xiàn)模塊化管理。redux 通過自帶的函數(shù) combineReducers 對自身切割分為多個模塊。
1. redux分割例子 import { combineReducers } from "redux" import { albumItem } from "./reducers/MusicAlbumItem" import { ranking } from "./reducers/MusicRanking" import { user } from "./reducers/MusicUser" import { collection } from "./reducers/MusicCollection" export const rootReducer = combineReducers({ player, ranking, user, collection }) 2. 多帶帶分割出來redux的例子 const R_CHANGE = "改變緩存排行版" const R_INIT = "重置排行版" const R_LOADING = "排行版列表加在完畢" //以下為store let rankingStore = { rank:[], target:{ id:0, playlist:{} }, loading:true } //以下為reducers export const ranking = (state = rankingStore, action) => { switch(action.type) { case R_INIT: state.rank = action.list return Object.assign({}, state) case R_CHANGE: state.target = action.list return Object.assign({}, state) case R_LOADING: state.loading = false return Object.assign({}, state) default: return state } } //以下為action export function r_change(list) { return { type: R_CHANGE, list:list } } export function r_init(list) { return { type: R_INIT, list:list } } export function r_loading() { return { type: R_LOADING } }
在react的入口文件中注入store,使其可以被全局路由訪問
在對應的組件中引入需用的actino,stroe是直接訪問全局的,action是按需引入
以下為例子
import React from "react"; import ReactDOM from "react-dom" import { createStore, applyMiddleware, compose } from "redux" import { BrowserRouter } from "react-router-dom" import registerServiceWorker from "./registerServiceWorker" import "./index.css" import App from "./App" import { rootReducer } from "./redux/index" import thunk from "redux-thunk" import { Provider } from "react-redux" const store = createStore(rootReducer, compose( applyMiddleware(thunk), window.devToolsExtension ? window.devToolsExtension() : f => f )) //通過路由注入store,使其可被全局訪問stroe(前提是需訪問的組件引入對應的redux) ReactDOM.render( (), document.getElementById("root") );
在react 16 之前的版本可以通過簡單的遍歷組件中的props或者state數(shù)據(jù)的變化監(jiān)聽數(shù)據(jù)是否被更新,來控制組件的渲染,一個正常的組件在父組件的狀態(tài)被改變的情況下,會觸發(fā)render,如果是列表之類的組件render多了就會性能差,可以通過 shouldComponentUpdate 鉤子函數(shù)來決定組件是否接受更新
在react 16后,官方提出類似Component的接口 PureComponent,react可以自動幫你決定組件是否接受更新
在組件的使用時,必須對其賦于 全局唯一的KEY。在列表的渲染中不推薦使用循環(huán)的下標作為 key 在列表的渲染中,如果對列表某條數(shù)據(jù)刪除會改變其上下的組件的 key 改變
增大組件的復用性
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95408.html
摘要:之前寫了一篇沒有加入的的小博文。一拆分結構根據(jù)自己的習慣和固定套路,拆分目錄結構和組件結構。把的導航組件集中放在純粹是個人習慣。二代碼實現(xiàn)入口文件是用來做的數(shù)據(jù)持久化。添加事項后要通知其他組件更新數(shù)據(jù)。 讀前須知 這個項目是第一次使用Redux的實例,并不具有專業(yè)性的理論知識。純粹分享一次開發(fā)過程與心得。之前寫了一篇沒有加入Redux的React Native ToDoList的小博文...
摘要:使用解構方法操作一個深層的對象,再可能不會觸發(fā)以及模擬器和真機調(diào)試都正常,只有打包發(fā)布之后有這個問題。和第一個問題差不多,也是導致實體機有問題有更多坑的同學的可以一起分享交流,后續(xù)會持續(xù)更新 1. 使用解構方法操作一個深層的對象,再setState,可能不會觸發(fā)render(ios以及Android模擬器和真機調(diào)試都正常,只有打包發(fā)布之后Android有這個問題)。 ... /* Re...
摘要:在版本上,安卓系統(tǒng)上的渲染就有鋸齒,后來我們不分效果是使用圖片實現(xiàn)的,汗啊第三方組件不全。搖一搖問題的解決在我們使用了等狀態(tài)管理時,熱更新不會更新這些代碼,而頻繁搖一搖實在是太累了。此時可以使用此時相當于虛擬了一個搖一搖事件。 公司本年度有App任務,陸陸續(xù)續(xù)用RN開發(fā)了兩個應用。一款是涉及儀器控制的平板項目,另一款是客戶端的App。下文談談使用RN開發(fā)的部分認知(其實只是隨便扯一扯,...
摘要:簡要說明長處在于使用模塊規(guī)范,而不是使用的模塊規(guī)范,以及使用的模塊規(guī)范。簡單使用關于命令行工具使用,請參照官方文檔。相同模塊重復依賴模塊重復依賴很容易理解,模塊實現(xiàn)時可能分割為多個子文件實現(xiàn),每個子文件內(nèi)部可能會引用同一個模塊,如。 簡介 browerify: http://browserify.org/index.html browserify可以看做瀏覽器端的又一個模塊...
摘要:序年,立秋,打算入坑,知道這又是一項艱巨的任務。箭頭函數(shù)對象解構類拓展運算符升級地圖指南學習曲線較為陡峭的需要一個明確的指南,這張來自一個被了的,要好好看一看。開發(fā)簡書項目從零基礎入門到實戰(zhàn)接下來,領任務,去升級吧 序 2018年,立秋,打算入坑React,知道這又是一項艱巨的任務。在框架選擇時,確實糾結了很長時間,而為什么決定入坑React,是我看到一片文章。也決定把自己的基礎知識通...
閱讀 2220·2021-11-19 09:40
閱讀 1932·2021-11-08 13:24
閱讀 2463·2021-10-18 13:24
閱讀 2868·2021-10-11 10:57
閱讀 3592·2021-09-22 15:42
閱讀 1127·2019-08-29 17:11
閱讀 2538·2019-08-29 16:11
閱讀 2430·2019-08-29 11:11