gpt4 book ai didi

reactjs - 为什么选择 React.Children.only?

转载 作者:行者123 更新时间:2023-12-03 13:11:14 26 4
gpt4 key购买 nike

向 react 专家提出一个简短的问题;)

React.Children.only 是它的顶级 api 之一,react-redux ( <Provider /> ) 和 React Router ( <Router /> ) 非常常用来注入(inject) store/router 作为上下文,这背后的原因是什么,为什么不简单地使用 return props.children 呢?似乎与 JSX 有关?

编辑:请不要解释什么是什么React.Children.only,我问的是为什么使用它而不是 props.children,后者看起来更强大/灵活。

最佳答案

正如 docs 中指出的那样

Verifies that children has only one child (a React element) and returns it. Otherwise this method throws an error.

那么现在为什么它比仅使用 props.children 更有帮助?

主要原因是它抛出了一个错误,从而停止了整个开发流程,所以你不能跳过它。

这是一个方便的实用程序,它强制执行专门且一个子级的规则。

当然,您可以使用 propTypes,但这只会在控制台中发出警告,您可能会错过该警告。

React.Children.only 的一个用例可以是强制执行应由一个逻辑子组件组成的特定声明性接口(interface):

class GraphEditorEditor extends React.Component {
componentDidMount() {
this.props.editor.makeEditable();
// and all other editor specific logic
}

render() {
return null;
}
}

class GraphEditorPreview extends React.Component {
componentDidMount() {
this.props.editor.makePreviewable();
// and all other preview specific logic
}

render() {
return null;
}
}

class GraphEditor extends React.Component {
static Editor = GraphEditorEditor;
static Preview = GraphEditorPreview;
wrapperRef = React.createRef();

state = {
editorInitialized: false
}

componentDidMount() {
// instantiate base graph to work with in logical children components
this.editor = SomeService.createEditorInstance(this.props.config);
this.editor.insertSelfInto(this.wrapperRef.current);

this.setState({ editorInitialized: true });
}

render() {
return (
<div ref={this.wrapperRef}>
{this.editorInitialized ?
React.Children.only(
React.cloneElement(
this.props.children,
{ editor: this.editor }
)
) : null
}
</div>
);
}
}

可以这样使用:

class ParentContainer extends React.Component {
render() {
return (
<GraphEditor config={{some: "config"}}>
<GraphEditor.Editor> //<-- EDITOR mode
</GraphEditor>
)
}
}

// OR

class ParentContainer extends React.Component {
render() {
return (
<GraphEditor config={{some: "config"}}>
<GraphEditor.Preview> //<-- Preview mode
</GraphEditor>
)
}
}

希望这对您有所帮助。

关于reactjs - 为什么选择 React.Children.only?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48837831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com