如何在grand parent中定义占位符/槽并从子注入组件?

时间:2018-01-22 22:12:29

标签: reactjs

在许多编程语言中 - 例如。 go和c#razor你有能力定义占位符/区域(布局),你可以从其他模板/视图注入内容。

我知道在一些前端框架中,这也是可能的。 aurelia你定义插槽。我还发现这个库https://github.com/dschnare/react-slothttps://github.com/monvillalon/react-page-layout似乎没有被积极维护。

然后我发现了这个:https://reactjs.org/docs/composition-vs-inheritance.html它似乎做了类似的事情,除了它走向错误的方向。在这里,父母必须知道孩子,因为你从父母那里传递了孩子。

相反,我想在父级中定义一个占位符,我可以从子级中引用它,并以某种方式插入一个大孩子。

以下是我尝试做的事情的说明:

enter image description here

希望它有意义。怎么能在React中完成?

2 个答案:

答案 0 :(得分:1)

你不需要老虎机。您可以使用状态和条件渲染来实现此目的。

对于不同的页面呈现我推荐react-router

" slot"对于设置按钮,您可以使用条件来渲染它。

这是一个运行代码段,其中包含一个非常简单的示例:



const PageOne = ({ showSettings }) => (
  <div>{!showSettings ? <h1>Page 1</h1> : <div>Settings Page</div>}</div>
);
const HomePage = () => <h1>Home Page</h1>;

const ButtonPageOne = ({ onClick }) => (
  <button onClick={onClick}>Button for Page 1 only</button>
);

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      showPageOne: false,
      showSettings: false
    };
  }

  togglePages = () => 
    this.setState({ showPageOne: !this.state.showPageOne });
    
  onSettingsClick = () =>
    this.setState({ showSettings: !this.state.showSettings });

  render() {
    const { showPageOne, showSettings } = this.state;
    return (
      <div>
        <div>
          <h3>Some header</h3>
          <div style={{ float: "right" }}>
            {showPageOne && <ButtonPageOne onClick={this.onSettingsClick} />}
          </div>
          <div>
            <button onClick={this.togglePages}>togglePages</button>
          </div>
        </div>
        <hr />
        {showPageOne ? <PageOne showSettings={showSettings} /> : <HomePage />}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
&#13;
&#13;
&#13;

我有条件地渲染元素,当然您可以有条件地传递一些CSS类或styles

这里的关键点是你应该lift the state up,让父母管理一些兄弟姐妹需要知道的状态(或者使用像redux这样的州经理。)

答案 1 :(得分:0)

你可以使用回调道具来实现这一点,不过我会反对它。

在父级上,定义一个名为showSettingsIcon的函数,该函数接受一个布尔参数并将其作为prop传递给子级。孩子将有逻辑来确定它是否具有设置子项并调用该函数。确保该功能是&#34;绑定&#34;对于父母,就像你对任何其他回调道具一样。

您可以使用另一个回调道具setGrandchildComponent或其他东西,它将组件实例或组件类型作为参数。调用时,父级将保存对参数的引用并将其克隆或在render()中创建它的实例。

但是,如果你做了类似这样的事情,那么你会搞砸使{React}变得如此强大的"Unidirectional Data Flow"。通过上下传递数据和命令,您的应用程序变得更不确定,更难以推理。随着您的应用变得越来越复杂,重现棘手的错误并添加新功能真的很难。

如果您真的确实需要此类功能,我建议您查看状态管理库,例如ReduxMobX。但是有一个警告:他们有一个非常重要的学习曲线。

我最近迁移了一个项目,将Redux与React一起使用,因为我想要像你描述的很酷的功能。我把自己写进了一个不舒服的角落。使用任何库/框架的哲学粒度比使用它更好。