摘要:在列表的渲染中不推薦使用循環(huán)的下標(biāo)作為在列表的渲染中,如果對(duì)列表某條數(shù)據(jù)刪除會(huì)改變其上下的組件的改變?cè)龃蠼M件的復(fù)用性
React 有關(guān)使用包
使用官方提供的react腳手架搭建的小型項(xiàng)目:create-react-app
react中使用路由react-router-dom
單向數(shù)據(jù)流使用的是redux,通過redux-thunk中間件實(shí)現(xiàn)異步操作
使用單向數(shù)據(jù)流與路由中,通過props逐級(jí)傳遞有點(diǎn)麻煩,性能不佳,使用中間件形式的react-redux構(gòu)造裝飾器,可以訪問全局?jǐn)?shù)據(jù)流
在react項(xiàng)目中還是用了懶加載react-loadable
import Loadable from "react-loadable" const Loading = ({ //自定義公用加載時(shí)頁面 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 組件的構(gòu)造函數(shù):接受父組件的參數(shù),初始化state,綁定函數(shù)等等的操作 2. componentWillMount 組件渲染之前,每次組件渲染都會(huì)觸發(fā)一次 3. componentDidMount 組件渲染之后,每次組件渲染都會(huì)觸發(fā)一次,子組件都掛載好,可以使用refs,可以使用異步方法,防止阻塞UI 4. componentWillReceiveProps 該函數(shù)接收到新的props才會(huì)被調(diào)用,render不會(huì)觸發(fā)該函數(shù) 5. shouldComponentUpdate 在組件接收到新的props或者state時(shí)被調(diào)用。在初始化時(shí)或者使用forceUpdate時(shí)不被調(diào)用。 6. componentWillUpdate 該函數(shù)接收到新的props或者state與render之前才會(huì)被調(diào)用,初始化不會(huì)觸發(fā)該函數(shù) 7. componentDidUpdate 該函數(shù)在組件完成更新后立即調(diào)用。在初始化時(shí)不會(huì)被調(diào)用。 8. componentWillUnmount 該函數(shù)為組件被移除(卸載)時(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 在大型項(xiàng)目中可與 vuex 一樣實(shí)現(xiàn)模塊化管理。redux 通過自帶的函數(shù) combineReducers 對(duì)自身切割分為多個(gè)模塊。
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,使其可以被全局路由訪問
在對(duì)應(yīng)的組件中引入需用的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(前提是需訪問的組件引入對(duì)應(yīng)的redux) ReactDOM.render( (), document.getElementById("root") );
在react 16 之前的版本可以通過簡單的遍歷組件中的props或者state數(shù)據(jù)的變化監(jiān)聽數(shù)據(jù)是否被更新,來控制組件的渲染,一個(gè)正常的組件在父組件的狀態(tài)被改變的情況下,會(huì)觸發(fā)render,如果是列表之類的組件render多了就會(huì)性能差,可以通過 shouldComponentUpdate 鉤子函數(shù)來決定組件是否接受更新
在react 16后,官方提出類似Component的接口 PureComponent,react可以自動(dòng)幫你決定組件是否接受更新
在組件的使用時(shí),必須對(duì)其賦于 全局唯一的KEY。在列表的渲染中不推薦使用循環(huán)的下標(biāo)作為 key 在列表的渲染中,如果對(duì)列表某條數(shù)據(jù)刪除會(huì)改變其上下的組件的 key 改變
增大組件的復(fù)用性
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95408.html
摘要:之前寫了一篇沒有加入的的小博文。一拆分結(jié)構(gòu)根據(jù)自己的習(xí)慣和固定套路,拆分目錄結(jié)構(gòu)和組件結(jié)構(gòu)。把的導(dǎo)航組件集中放在純粹是個(gè)人習(xí)慣。二代碼實(shí)現(xiàn)入口文件是用來做的數(shù)據(jù)持久化。添加事項(xiàng)后要通知其他組件更新數(shù)據(jù)。 讀前須知 這個(gè)項(xiàng)目是第一次使用Redux的實(shí)例,并不具有專業(yè)性的理論知識(shí)。純粹分享一次開發(fā)過程與心得。之前寫了一篇沒有加入Redux的React Native ToDoList的小博文...
摘要:使用解構(gòu)方法操作一個(gè)深層的對(duì)象,再可能不會(huì)觸發(fā)以及模擬器和真機(jī)調(diào)試都正常,只有打包發(fā)布之后有這個(gè)問題。和第一個(gè)問題差不多,也是導(dǎo)致實(shí)體機(jī)有問題有更多坑的同學(xué)的可以一起分享交流,后續(xù)會(huì)持續(xù)更新 1. 使用解構(gòu)方法操作一個(gè)深層的對(duì)象,再setState,可能不會(huì)觸發(fā)render(ios以及Android模擬器和真機(jī)調(diào)試都正常,只有打包發(fā)布之后Android有這個(gè)問題)。 ... /* Re...
摘要:在版本上,安卓系統(tǒng)上的渲染就有鋸齒,后來我們不分效果是使用圖片實(shí)現(xiàn)的,汗啊第三方組件不全。搖一搖問題的解決在我們使用了等狀態(tài)管理時(shí),熱更新不會(huì)更新這些代碼,而頻繁搖一搖實(shí)在是太累了。此時(shí)可以使用此時(shí)相當(dāng)于虛擬了一個(gè)搖一搖事件。 公司本年度有App任務(wù),陸陸續(xù)續(xù)用RN開發(fā)了兩個(gè)應(yīng)用。一款是涉及儀器控制的平板項(xiàng)目,另一款是客戶端的App。下文談?wù)勈褂肦N開發(fā)的部分認(rèn)知(其實(shí)只是隨便扯一扯,...
摘要:簡要說明長處在于使用模塊規(guī)范,而不是使用的模塊規(guī)范,以及使用的模塊規(guī)范。簡單使用關(guān)于命令行工具使用,請(qǐng)參照官方文檔。相同模塊重復(fù)依賴模塊重復(fù)依賴很容易理解,模塊實(shí)現(xiàn)時(shí)可能分割為多個(gè)子文件實(shí)現(xiàn),每個(gè)子文件內(nèi)部可能會(huì)引用同一個(gè)模塊,如。 簡介 browerify: http://browserify.org/index.html browserify可以看做瀏覽器端的又一個(gè)模塊...
摘要:序年,立秋,打算入坑,知道這又是一項(xiàng)艱巨的任務(wù)。箭頭函數(shù)對(duì)象解構(gòu)類拓展運(yùn)算符升級(jí)地圖指南學(xué)習(xí)曲線較為陡峭的需要一個(gè)明確的指南,這張來自一個(gè)被了的,要好好看一看。開發(fā)簡書項(xiàng)目從零基礎(chǔ)入門到實(shí)戰(zhàn)接下來,領(lǐng)任務(wù),去升級(jí)吧 序 2018年,立秋,打算入坑React,知道這又是一項(xiàng)艱巨的任務(wù)。在框架選擇時(shí),確實(shí)糾結(jié)了很長時(shí)間,而為什么決定入坑React,是我看到一片文章。也決定把自己的基礎(chǔ)知識(shí)通...
閱讀 2183·2021-11-19 09:40
閱讀 1919·2021-11-08 13:24
閱讀 2453·2021-10-18 13:24
閱讀 2858·2021-10-11 10:57
閱讀 3578·2021-09-22 15:42
閱讀 1114·2019-08-29 17:11
閱讀 2528·2019-08-29 16:11
閱讀 2421·2019-08-29 11:11