export default ({ name = '小明', sex = '男' }) => (
<>
我叫 {name},性别 {sex}
</>
);
// 错误
<MyInput inputValue onInputChange wrapStyle wrapClassName />
// 正确
<MyInput value onChange style className />
// 错误:
render() {
const obj = {num: 1}
return (
<Child obj={obj} onClick={()=>{...}} />
);
}
// 错误:
render() {
const a = 8;
return (
<div>
{
a > 0 ? a < 9 ? ... : ... : ...
}
</div>
);
}
// 正确:
f() {
// ...
}
render() {
const a = 8;
return (
<div>
{
this.f()
}
</div>
);
}
&&
简化三元运算例如:
{
loading ? <Loading /> : null;
}
可简化为
{
loading && <Loading />;
}
尽量避免使用展开运算符来展开 props
变得难以理解和维护,容易出 bug
遇到事件处理,可以使用一个返回新函数的方法
例如:
import React from 'react';
export default function SampleComponent({ onValueChange }) {
const handleChange = (key) => {
return (e) => onValueChange(key, e.target.value);
};
return (
<form>
<input onChange={handleChange('name')} />
<input onChange={handleChange('email')} />
<input onChange={handleChange('phone')} />
</form>
);
}
// 组件
import React, { useCallback, useState } from 'react';
import ConfirmationDialog from 'components/global/ConfirmationDialog';
export default function useConfirmationDialog({ headerText, bodyText, confirmationButtonText, onConfirmClick }) {
const [isOpen, setIsOpen] = useState(false);
const onOpen = () => {
setIsOpen(true);
};
const Dialog = useCallback(
() => (
<ConfirmationDialog
headerText={headerText}
bodyText={bodyText}
isOpen={isOpen}
onConfirmClick={onConfirmClick}
onCancelClick={() => setIsOpen(false)}
confirmationButtonText={confirmationButtonText}
/>
),
[isOpen]
);
return {
Dialog,
onOpen,
};
}
// 使用
import React from 'react';
import { useConfirmationDialog } from './useConfirmationDialog';
function Client() {
const { Dialog, onOpen } = useConfirmationDialog({
headerText: 'Delete this record?',
bodyText: 'Are you sure you want delete this record? This cannot be undone.',
confirmationButtonText: 'Delete',
onConfirmClick: handleDeleteConfirm,
});
function handleDeleteConfirm() {}
const handleDeleteClick = () => {
onOpen();
};
return (
<div>
<Dialog />
<button onClick={handleDeleteClick} />
</div>
);
}
export default Client;
这种模式可以少写很多与组件相关的 state,比如弹窗的 visible、title 之类的
// 例如:
import React from 'react';
import ItemDisplay from './ItemDisplay';
export default function SampleComponent() {
const { data, handleDelete, handleEdit, handleAdd } = useCustomHook();
return (
<div>
<div>
{data.map((item) => (
<ItemDisplay item={item} />
))}
</div>
<div>
<button onClick={handleDelete} />
<button onClick={handleAdd} />
<button onClick={handleEdit} />
</div>
</div>
);
}
不要把所有状态存放在 redux,redux 只用于存放用户登录信息、主题等信息
不要任何变量都使用状态,可以使用 useRef 或成员属性(类组件)来储存与更新渲染无关的变量,可以通过已保存的状态来推断出的状态可使用 useMemo 来计算,而不要创建新状态
尽量不要在组件中声明新的组件
// 错误,不建议
function A() {
const B = () => {
return <p>hello</p>;
};
return (
<div>
<B />
</div>
);
}
原因:
高耦合
影响性能,A 每一次渲染都会重新声明一遍 B
避免为了优化少量性能过度设计代码,牺牲代码的可维护性、易读性,浪费时间