使用react的7個避坑案例小結(jié)
React是個很受歡迎的前端框架。今天我們探索下React開發(fā)者應(yīng)該注意的七個點(diǎn)。
1. 組件臃腫
React開發(fā)者沒有創(chuàng)建必要的足夠多的組件化,其實(shí)這個問題不局限于React開發(fā)者,很多Vue開發(fā)者也是。
當(dāng)然,我們現(xiàn)在討論的是React
在React中,我們可以創(chuàng)建一個很多內(nèi)容的組件,來執(zhí)行我們的各種任務(wù),但是最好是保證組件精簡 -- 一個組件關(guān)聯(lián)一個函數(shù)。這樣不僅節(jié)約你的時間,而且能幫你很好地定位問題。
比如下面的TodoList組件:
// ./components/TodoList.js
import React from 'react';
import { useTodoList } from '../hooks/useTodoList';
import { useQuery } from '../hooks/useQuery';
import TodoItem from './TodoItem';
import NewTodo from './NewTodo';
const TodoList = () => {
const { getQuery, setQuery } = useQuery();
const todos = useTodoList();
return (
<div>
<ul>
{todos.map(({ id, title, completed }) => (
<TodoItem key={id} id={id} title={title} completed={completed} />
))}
<NewTodo />
</ul>
<div>
Highlight Query for incomplete items:
<input value={getQuery()} onChange={e => setQuery(e.target.value)} />
</div>
</div>
);
};
export default TodoList;
2. 直接更改state
在React中,狀態(tài)應(yīng)該是不變的。如果你直接修改state,會導(dǎo)致難以修改的性能問題。
比如下面例子:
const modifyPetsList = (element, id) => {
petsList[id].checked = element.target.checked;
setPetsList(petList)
}
上面例子中,你想更改數(shù)組對象中checked鍵。但是你遇到一個問題:因?yàn)槭褂孟嗤囊酶牧藢ο螅琑eact無法觀察并觸發(fā)重新渲染。
解決這個問題,我們應(yīng)該使用setState()方法或者useState()鉤子。
我們使用useState()方法來重寫之前的例子。
const modifyPetsList = (element, id) => {
const { checked } = element.target;
setpetsList((pets) => {
return pets.map((pet, index) => {
if (id === index) {
pet = { ...pet, checked };
}
return pet;
});
});
};
3. props該傳數(shù)字類型的值卻傳了字符串,反之亦然
這是個很小的錯誤,不應(yīng)該出現(xiàn)。
比如下面的例子:
class Arrival extends React.Component {
render() {
return (
<h1>
Hi! You arrived {this.props.position === 1 ? "first!" : "last!"} .
</h1>
);
}
}
這里===對字符串'1'是無效的。而解決這個問題,需要我們在傳遞props值的時候用{}包裹。
修正如下:
// ❌
const element = <Arrival position='1' />;
// ✅
const element = <Arrival position={1} />;
4. list組件中沒使用key
假設(shè)我們需要渲染下面的列表項(xiàng):
const lists = ['cat', 'dog', 'fish'];
render() {
return (
<ul>
{lists.map(listNo =>
<li>{listNo}</li>)}
</ul>
);
}
當(dāng)然,上面的代碼可以運(yùn)行。當(dāng)列表比較龐雜并需要進(jìn)行更改等操作的時候,就會帶來渲染的問題。
React跟蹤文檔對象模型(DOM)上的所有列表元素。沒有記錄可以告知React,列表發(fā)生了什么改動。
解決這個問題,你需要添加keys在你的列表元素中。keys賦予每個元素唯一標(biāo)識,這有助于React確定已添加,刪除,修改了哪些項(xiàng)目。
如下:
<ul>
{lists.map(listNo =>
<li key={listNo}>{listNo}</li>)}
</ul>
5. setState是異步操作
很容易忘記React中的state是異步操作的。如果你在設(shè)置一個值之后就去訪問它,那么你可能不能立馬獲取到該值。
我們看看下面的例子:
handlePetsUpdate = (petCount) => {
this.setState({ petCount });
this.props.callback(this.state.petCount); // Old value
};
你可以使用setState()的第二個參數(shù),回調(diào)函數(shù)來處理。比如:
handlePetsUpdate = (petCount) => {
this.setState({ petCount }, () => {
this.props.callback(this.state.petCount); // Updated value
});
};
6. 頻繁使用Redux
在大型的React app中,很多開發(fā)者使用Redux來管理全局狀態(tài)。
雖然Redux很有用,但是沒必要使用它來管理每個狀態(tài)。
如果我們的應(yīng)用程序沒有需要交換信息的并行級組件的時候,那么就不需要在項(xiàng)目中添加額外的庫。比如我們想更改組件中的表單按鈕狀態(tài)的時候,我們更多的是優(yōu)先考慮state方法或者useState鉤子。
7. 組件沒以大寫字母開頭命名
在JSX中,以小寫開頭的組件會向下編譯為HTML元素。
所以我們應(yīng)該避免下面的寫法:
class demoComponentName extends React.Component {
}
這將導(dǎo)致一個錯誤:如果你想渲染React組件,則需要以大寫字母開頭。
那么得采取下面這種寫法:
class DemoComponentName extends React.Component {
}
后話
上面的內(nèi)容提取自Top 10 mistakes to avoid when using React,采用了意譯的方式,提取了7條比較實(shí)用的內(nèi)容。
到此這篇關(guān)于使用react的7個避坑案例小結(jié)的文章就介紹到這了,更多相關(guān)react 坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React文件名和目錄規(guī)范最佳實(shí)踐記錄(總結(jié)篇)
React在使用時非常靈活,如果沒有一個規(guī)范約束項(xiàng)目,在開發(fā)過程中會非?;靵y,本文將介紹幾個優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡述一下幾種通用的類型,用來區(qū)分文件的功能,感興趣的朋友一起看看吧2022-05-05
用React實(shí)現(xiàn)一個完整的TodoList的示例代碼
本篇文章主要介紹了用React實(shí)現(xiàn)一個完整的TodoList的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
ReactNative踩坑之配置調(diào)試端口的解決方法
本篇文章主要介紹了ReactNative踩坑之配置調(diào)試端口的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
React Fiber結(jié)構(gòu)的創(chuàng)建步驟
這篇文章主要介紹了React Fiber結(jié)構(gòu)的創(chuàng)建步驟,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下2021-04-04
React通過redux-persist持久化數(shù)據(jù)存儲的方法示例
這篇文章主要介紹了React通過redux-persist持久化數(shù)據(jù)存儲的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
react中useState使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)
這篇文章主要介紹了react中useState的使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

