使用 HOC 增强 React 组件
Enhance react component with HOC
我需要创建一个可重复使用的相机组件,为此我想传递一个自定义记录按钮,我需要附加额外的功能或覆盖按钮文本。
举个例子:
https://codesandbox.io/s/react-hoc-ksjbf
我创建了一个采用自定义组件的 hoc.js 并尝试覆盖文本属性,但出现此错误:
Element type is invalid: expected a string (for built-in components)
or a class/function (for composite components) but got: object.
我不明白哪里错了,有什么想法吗?
问题
您正在将 JSX 文字(即对象)作为道具值传递给(传递给)高阶组件与 React 组件。
recordbutton={<Button text="Original Text" />}
解决方案
改为传递 React 组件
<Camera recordbutton={(props) => <Button text="Original Text" {...props} />} />
或定义并传递
const RecordButton = (props) => <Button text="Original Text" {...props} />;
export default function App() {
return (
<div className="App">
<Camera recordbutton={RecordButton} />
</div>
);
}
或者直接传递Button
组件
export default function App() {
return (
<div className="App">
<Camera recordbutton={Button} />
</div>
);
}
只要您将所有道具传递给组件,那么 HOC 就可以 inject/override 道具值。
更新 HOC 以在 提供覆盖之前传播传递的道具,这样 HOC 就可以 实际上 覆盖它们。
function alterText(Component) {
return function (props) {
return <Component {...props} text="new text" />;
};
}
我需要创建一个可重复使用的相机组件,为此我想传递一个自定义记录按钮,我需要附加额外的功能或覆盖按钮文本。
举个例子:
https://codesandbox.io/s/react-hoc-ksjbf
我创建了一个采用自定义组件的 hoc.js 并尝试覆盖文本属性,但出现此错误:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.
我不明白哪里错了,有什么想法吗?
问题
您正在将 JSX 文字(即对象)作为道具值传递给(传递给)高阶组件与 React 组件。
recordbutton={<Button text="Original Text" />}
解决方案
改为传递 React 组件
<Camera recordbutton={(props) => <Button text="Original Text" {...props} />} />
或定义并传递
const RecordButton = (props) => <Button text="Original Text" {...props} />;
export default function App() {
return (
<div className="App">
<Camera recordbutton={RecordButton} />
</div>
);
}
或者直接传递Button
组件
export default function App() {
return (
<div className="App">
<Camera recordbutton={Button} />
</div>
);
}
只要您将所有道具传递给组件,那么 HOC 就可以 inject/override 道具值。
更新 HOC 以在 提供覆盖之前传播传递的道具,这样 HOC 就可以 实际上 覆盖它们。
function alterText(Component) {
return function (props) {
return <Component {...props} text="new text" />;
};
}