在 React 中处理 null 道具的最佳实践?
Best practice to handle null props in React?
假设我有两个组件:
// Hello.js
import React from "react";
export default function Hello(props) {
const { name = "mike" } = props;
return <div>Hello {name}</div>;
}
// App.js
import React from "react";
import Hello from "./Hello";
export default function App() {
return (
<div>
<Hello name={null} />
</div>
);
}
// renders Hello
如果我将 null
props 传递给 Hello
组件, Hello
组件将不会使用默认值,相反,它只会使用 null
作为值并渲染它。
仅当我明确传递 undefined
或不传递任何内容时才会使用默认值:
<Hello name={undefined} />
<Hello />
// renders Hello mike
所以我的问题是我应该如何正确处理 null 道具?像这样将它传递给子组件时,我应该在父组件中处理它吗:
// App.js
<Hello name={getName() || 'mike'} />
或者我应该像这样在子组件中处理它:
// Hello.js
return <div>Hello {name || "mike"}</div>;
是否有任何“最佳实践”来帮助处理这个问题?
糟糕,因为其他人会忘记并大喊 WTF
// App.js
<Hello name={getName() || 'mike'} />
一般,但是这样丑,分配默认值更优雅
// Hello.js
return <div>Hello {name || "mike"}</div>;
更好,为什么不只是 return string 或 undefined
function getName(){
...
return something || undefined
}
最好,人们不会总是这样做,如何确定? TypeScript 会在编译时检查它
interface Props {
name: string;
}
interface State {
xxx: xxx
}
class Hello extends React.Component<Props, State> {
随便选,因为最好的成本最高
您可以使用 JS 空合并运算符通过以下方式实现:
props.name ?? 'Default value'
假设我有两个组件:
// Hello.js
import React from "react";
export default function Hello(props) {
const { name = "mike" } = props;
return <div>Hello {name}</div>;
}
// App.js
import React from "react";
import Hello from "./Hello";
export default function App() {
return (
<div>
<Hello name={null} />
</div>
);
}
// renders Hello
如果我将 null
props 传递给 Hello
组件, Hello
组件将不会使用默认值,相反,它只会使用 null
作为值并渲染它。
仅当我明确传递 undefined
或不传递任何内容时才会使用默认值:
<Hello name={undefined} />
<Hello />
// renders Hello mike
所以我的问题是我应该如何正确处理 null 道具?像这样将它传递给子组件时,我应该在父组件中处理它吗:
// App.js
<Hello name={getName() || 'mike'} />
或者我应该像这样在子组件中处理它:
// Hello.js
return <div>Hello {name || "mike"}</div>;
是否有任何“最佳实践”来帮助处理这个问题?
糟糕,因为其他人会忘记并大喊 WTF
// App.js
<Hello name={getName() || 'mike'} />
一般,但是这样丑,分配默认值更优雅
// Hello.js
return <div>Hello {name || "mike"}</div>;
更好,为什么不只是 return string 或 undefined
function getName(){
...
return something || undefined
}
最好,人们不会总是这样做,如何确定? TypeScript 会在编译时检查它
interface Props {
name: string;
}
interface State {
xxx: xxx
}
class Hello extends React.Component<Props, State> {
随便选,因为最好的成本最高
您可以使用 JS 空合并运算符通过以下方式实现:
props.name ?? 'Default value'