摘要:又一篇來(lái)自日常開(kāi)發(fā)的匯總各位客官請(qǐng)對(duì)號(hào)入席,店小二逐一上菜。解決方案有很多種,例如把字符串?dāng)?shù)組等重組對(duì)象數(shù)組,每個(gè)元素設(shè)置一個(gè)唯一等。另外有個(gè)方式推薦使用生成唯一的數(shù)組,和數(shù)據(jù)數(shù)組一起使用,省去提交數(shù)據(jù)時(shí)再重組數(shù)組。
又一篇來(lái)自日常開(kāi)發(fā)的匯總:各位客官請(qǐng)對(duì)號(hào)入席,店小二逐一上菜。
react數(shù)組循環(huán),基本都會(huì)設(shè)置一個(gè)唯一的key,表格的對(duì)象數(shù)組循環(huán)一般沒(méi)什么問(wèn)題,數(shù)據(jù)基本都會(huì)有一個(gè)id。那有種情況就比較坑了,出現(xiàn)在表單形式的頁(yè)面結(jié)構(gòu)中,對(duì)某個(gè)數(shù)組進(jìn)行增刪改操作,一般對(duì)于非對(duì)象數(shù)組而言,沒(méi)有id,可能很多人會(huì)偷懶,循環(huán)的時(shí)候,直接設(shè)置數(shù)組的下標(biāo)index作為key,當(dāng)出現(xiàn)增刪改時(shí)候,就會(huì)出現(xiàn)數(shù)據(jù)對(duì)不上或者重新渲染組件的問(wèn)題等。解決方案有很多種,例如把字符串?dāng)?shù)組等重組對(duì)象數(shù)組,每個(gè)元素設(shè)置一個(gè)唯一id等。另外有個(gè)方式:推薦使用shortid生成唯一key的數(shù)組,和數(shù)據(jù)數(shù)組一起使用,省去提交數(shù)據(jù)時(shí)再重組數(shù)組。
import React from "react"; import shortid from "shortid"; class Demo extends React.Component { constructor(props) { super(props); this.state = { data: ["a", "b", "c"] } this.dataKeys = this.state.data.map(v => shortid.generate()); } deleteOne = index => { // 刪除操作 const { data } = this.state; this.setState({ data: data.filter((v, i) => i !== index) }); this.dataKyes.splice(index, 1); } render() { return (
通過(guò)判斷值是否存在來(lái)控制元素是否顯示,一般三目運(yùn)算可以達(dá)到此效果,最簡(jiǎn)單的還是用短路的寫(xiě)法:
// 不錯(cuò) const flag = "something"; flag && // 很好 // 注意一般可能上面寫(xiě)法多一些,但當(dāng)flag為0 的時(shí)頁(yè)面上會(huì)顯示0,用!!將其轉(zhuǎn)為boolean避免坑, // 代碼也更規(guī)范 const flag = "something"; !!flag &&
使用組件,傳遞props:
const { data, type, something } = this.state;
也許另外一種傳遞方式更簡(jiǎn)潔:
const { data, type, something } = this.state;
組件的props有時(shí)候會(huì)定義很多,但是調(diào)用組件傳遞props的時(shí)候又想一個(gè)個(gè)傳,不想一次性傳遞一個(gè)option對(duì)象,通過(guò)擴(kuò)展運(yùn)算符和解構(gòu)賦值可以簡(jiǎn)化此操作:
const Demo = ({ prop1, prop2, prop3, ...restProps }) => (xxxx { restProps.something }) // 父組件使用Demo
一般改變state值的一種方式:
const { data } = this.state; this.setState({ data: {...data, key: 1 } });
另外一種可以通過(guò)callback的方式改變state的值
this.setState(({ data }) => ({ data: {...data, key: 1 } }));
還可以:
this.setState((state, props) => { return { counter: state.counter + props.step }; });
React 性能優(yōu)化有很多種方式,那常見(jiàn)的一種就是在生命周期函數(shù)shouldComponentUpdate里面判斷某些值或?qū)傩詠?lái)控制組件是否重新再次渲染。
判斷一般的字符串,數(shù)字或者基礎(chǔ)的對(duì)象,數(shù)組都還是比較好處理,那嵌套的對(duì)象或者數(shù)組就比較麻煩了,對(duì)于這種,可以轉(zhuǎn)成字符串處理,但屬性值的位置不同時(shí),那就無(wú)效了。
推薦使用lodash(或者其他的類(lèi)似庫(kù))的isEqual對(duì)嵌套數(shù)組或?qū)ο筮M(jìn)行判斷(相比其他方式更簡(jiǎn)單些)
shouldComponentUpdate(nextProps, nextState) { if (_.isEqual(nextState.columns, this.state.columns)) return false; return true; }
創(chuàng)建彈層的三種方式:
普通組件通過(guò)state和樣式控制,在當(dāng)前組件中顯示彈層-每次引入組件并且render里面控制顯示,掛載節(jié)點(diǎn)在某組件里面
// 彈層 const Dialog = () =>彈層// 某組件 render() { return ( this.state.showDialog && ) }
2.通過(guò)Portals創(chuàng)建通道,在根節(jié)點(diǎn)外部掛載組件-但還是需要每次引入并且在render里面調(diào)用
// 彈層 class Dialog extends React.Component { constructor(props) { super(props); this.el = document.createElement("div"); } componentDidMount() { modalRoot.appendChild(this.el); } componentWillUnmount() { modalRoot.removeChild(this.el); } render() { return ReactDOM.createPortal( this.props.children ||xxxx, this.el, ); } } // 某組件 render() { return ( this.state.showDialog && ) }
3.推薦使用ReactDom.render創(chuàng)建彈層-掛載根節(jié)點(diǎn)外層,使用也更方便
// demo let dialog; class Dialog { show(children) { // 顯示 this.div = document.createElement("div"); document.body.appendChild(this.div); ReactDom.render(children ||xxxx, this.div); } destroy() { // 銷(xiāo)毀 ReactDom.unmountComponentAtNode(this.div); this.div.parentNode.removeChild(this.div); } } export default { show: function(children) { dialog = new Dialog(); dialog.show(children); }, hide: xxxxx }; // 某組件 import Dialog from "xxx"; alert = () => { Dialog.show(xxxx); } render() { return ( ) }
render props是現(xiàn)在很流行的一種渲染方式,通過(guò)回調(diào)函數(shù),渲染子組件,參數(shù)可為父組件的任意屬性值(官網(wǎng)也有相應(yīng)的介紹)新版的contextApi也采用了這個(gè)模式。
很多種場(chǎng)景使用此方式的做法:
// 權(quán)限控制組件,只需要封裝一次connect, // 通過(guò)render props向子組件傳遞權(quán)限 class AuthWidget extends Component { render() { return this.props.children(this.props.auth); } } const mapStateToProps = state => { const { auth } = state; return { auth: state.auth }; }; export default connect(mapStateToProps)(AuthWidget); // 其他組件使用auth.edit && 編輯} /> // 使用antd的form時(shí) const Test = ({ form, children }) => { return children(form); }; const FormTest = Form.create()(Test); class Demo extends Component { render() { return ( xxxxx) } }{ form => { this.form = form; return ( {getFieldDecorator("field", xxx)( )} ) }}
子組件改變父組件的state方式有很多種,可以在父組件設(shè)置一個(gè)通用函數(shù),類(lèi)似:setParentState,通過(guò)子組件回調(diào)處理時(shí),就可以更方便的統(tǒng)一處理:
// 父組件 state = { data: {} } setParentState = obj => { this.setState(obj); } // 子組件 onClick = () => { this.props.setParentState({ data: xxx }); }
永遠(yuǎn)不要直接設(shè)置state的值:this.state.data = { a: 1 }。這個(gè)會(huì)導(dǎo)致幾個(gè)問(wèn)題:
1:組件不會(huì)重新渲染 2:shouldComponentUpdate(nextProps, nextState) 函數(shù)里面 this.state的值是已經(jīng)改變了,和nextState的值相同。
舉個(gè)栗子:
// wrong const { data } = this.state; data.a = 1; // 等價(jià)于this.state.data.a = 1; this.setState({ data }); // shouldComponentUpdate里面觀察到 this.state 和nextState的值是相同的 // 此時(shí)函數(shù)里面性能相關(guān)的優(yōu)化是無(wú)效的 // correct 需要用到當(dāng)前state值的寫(xiě)法 this.setState(state => ({ data: {...state.data, a: 1} }))
各位客官,菜已上齊,請(qǐng)慢用react相關(guān)討論,請(qǐng)加Q群:743490497
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97654.html
本文主要介紹一些JS中用到的小技巧,可以在日常Coding中提升幸福度,將不定期更新~ 1. 類(lèi)型強(qiáng)制轉(zhuǎn)換 1.1 string強(qiáng)制轉(zhuǎn)換為數(shù)字 可以用*1來(lái)轉(zhuǎn)化為數(shù)字(實(shí)際上是調(diào)用.valueOf方法)然后使用Number.isNaN來(lái)判斷是否為NaN,或者使用 a !== a 來(lái)判斷是否為NaN,因?yàn)?NaN !== NaN 32 * 1 // 32 ds * 1 ...
摘要:技術(shù)前端布局推進(jìn)劑間距規(guī)范化利用變量實(shí)現(xiàn)令人震驚的懸浮效果很棒,但有些情況不適用布局說(shuō)可能是最全的圖片版學(xué)習(xí)網(wǎng)格布局使用的九大誤區(qū)圖解布局布局揭秘和中新增功能探索版本迭代論基礎(chǔ)談?wù)雇麑?duì)比探究繪圖中撤銷(xiāo)功能的實(shí)現(xiàn)方式即將更改的生命周期幾道高 技術(shù) CSS 前端布局推進(jìn)劑 - 間距規(guī)范化 利用CSS變量實(shí)現(xiàn)令人震驚的懸浮效果 Flexbox 很棒,但有些情況不適用 CSS布局說(shuō)——可能是最...
摘要:技術(shù)前端布局推進(jìn)劑間距規(guī)范化利用變量實(shí)現(xiàn)令人震驚的懸浮效果很棒,但有些情況不適用布局說(shuō)可能是最全的圖片版學(xué)習(xí)網(wǎng)格布局使用的九大誤區(qū)圖解布局布局揭秘和中新增功能探索版本迭代論基礎(chǔ)談?wù)雇麑?duì)比探究繪圖中撤銷(xiāo)功能的實(shí)現(xiàn)方式即將更改的生命周期幾道高 技術(shù) CSS 前端布局推進(jìn)劑 - 間距規(guī)范化 利用CSS變量實(shí)現(xiàn)令人震驚的懸浮效果 Flexbox 很棒,但有些情況不適用 CSS布局說(shuō)——可能是最...
摘要:作者陳大魚(yú)頭魚(yú)頭總結(jié)一些能夠提高開(kāi)發(fā)效率的技巧,這些技巧很實(shí)用,覺(jué)得挺好,想推薦給大家,所以有了這篇文章。如果此時(shí)正在看文章的你也有類(lèi)似的技巧心得,不妨在下方留言來(lái)分享給大家。 作者:陳大魚(yú)頭 github: KRISACHAN 魚(yú)頭總結(jié)一些能夠提高開(kāi)發(fā)效率的JS技巧,這些技巧很實(shí)用,覺(jué)得挺好,想推薦給大家,所以有了這篇文章。 生成隨機(jī)UID const genUid = () ...
摘要:使用歸類(lèi)重復(fù)樣式和重復(fù)變量一樣,重復(fù)的樣式也可以歸類(lèi)。解決方案可以使用如下的寫(xiě)法兩端對(duì)齊姓名手機(jī)號(hào)碼賬號(hào)密碼效果如下相關(guān)文章輸出計(jì)劃最近總有朋友問(wèn)我相關(guān)的問(wèn)題,因此接下來(lái)我會(huì)輸出篇相關(guān)的文章,希望對(duì)大家有一定的幫助。前言 在這篇文章我會(huì)介紹 9 個(gè)使你的 CSS 更加簡(jiǎn)潔優(yōu)雅的使用技巧。這些技巧小生經(jīng)常使用,覺(jué)得挺高效實(shí)用,所以也就有了這篇文章。 9 個(gè) CSS 技巧 特此聲明,這里說(shuō)的...
閱讀 3310·2021-10-12 10:12
閱讀 3237·2021-09-22 16:04
閱讀 3446·2019-08-30 15:54
閱讀 2757·2019-08-29 16:59
閱讀 3132·2019-08-29 16:08
閱讀 1012·2019-08-29 11:20
閱讀 3639·2019-08-28 18:08
閱讀 838·2019-08-26 13:43