问题 从twig迁移到ReactJS:如何扩展模板/组件以构建完整的reactJS页面?实现react-router和redux到symfony?


在我的twig应用程序中,我有一个控制器呈现视图。

这个观点如下:

{% extends ':Template/Backend:backend.html.twig' %}

{% block title_wrapper %}
{% endblock %}

{% block body %}
 My code
{% endblock %}

在backend.html.twig中,我有:

{% extends ':Template/base.html.twig' %}

{% block navbar %}
   {% render controller ... %}
{% endblock %}

{% block sidebar%}
   {% render controller ... %}
{% endblock %}

{% block body %}
{% endblock %}

现在,这个页面是超级动态的,许多不同的ajax调用更新了不同的数据部分。 ReactJS似乎是让它变得更简单的好方法。

我理解如何将一个组件放在另一个组件中并在此基础上构建。 但是,根据我的页面内容,我的导航栏和侧边栏的内容如何使其工作?

我的问题是:

  1. 如果我渲染我的身体组件并且它与我的导航栏和侧边栏组件分开(保持现有的树枝结构并加载3个组件),一个中的更改将不会更新另一个组件
  2. 如果我加载一个包含导航栏,侧边栏和正文组件的应用程序组件,我该如何制作主体的变体,即如何复制树枝的“延伸”功能?
  3. 我需要一步一步地移动,所以我需要用树枝继续渲染我的应用程序的一部分
  4. 看起来我需要在我的symfony应用程序中正确实现reux和react-router,创建一个单页应用程序和一个包含navbars的app组件。我很感激你的一些帮助!

希望来自reactJS专家的一些帮助!谢谢!


7958
2018-01-31 09:18


起源

考虑到这一点,我有一种印象,我需要正确实现Redux,所以我会有一个单独的商店,我的所有组件都依赖于它。我视图中的用户操作会触发商店子集订阅的事件。这样,数据更新就会在每个组件上循环下降......仍然试图让它正确 - Sébastien


答案:


看看这个 小提琴,与 react-router 您可以分隔每个页面并创建组件,布局和视图。

ReactDOM.render(
  <Router>
    <Route path="/" component={AppContainer}>
      <IndexRoute component={HomeView} />
      <Route path="list" component={ListView} />
    </Route>
  </Router>,
  document.getElementById('root')
);

创建两个视图, home 和 list,他们可能看起来像这样:

class HomeView extends Component {
  render() {
    return (
      <MainLayout
        sidebarTitle="Links"
        sidebar={<SidebarList />}>
        Hello world! This is the HomeView!
      </MainLayout>
    );
  }
}

在每个视图内 extends 从布局中传递属性,比如我们需要的组件 sidebar 和a children

class ListView extends Component {
  render() {
    return (
        <MainLayout
        sidebarTitle="Text"
        sidebar={<SidebarText />}>
        <h1>List</h1>
        <ul>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
        </ul>
      </MainLayout>
    );
  }
}

在布局中使用该属性来显示内容,就像使用twig一样。

class MainLayout extends Component {
  render() {
    return (
      <div>
        <Navbar
          title="APP"
        />
        <div>
          <div>
            {this.props.children}
          </div>
          <div>
            {this.props.sidebar}
        </div>
      </div>
    );
  }
}

也许这有点令人困惑,但你需要看看小提琴,我可以根据你的例子做得越近。


7
2018-02-12 18:30



很好,谢谢,这是我失踪的行为。我将建立在这个例子上。 - Sébastien


我建议你从小处着手了解ReactJS的工作原理。您可以轻松地将ReactJS仅用于应用程序的有限部分。

假设您要更改位于id为“myComponent”的div内的应用程序组件。您可以在页面上放置一个脚本,使其成为ReactJS组件(ES6语法):

import MyComponent from './mycomponent';
ReactDOM.render( <MyComponent />, document.getElementById('myComponent'));

在这段代码中, <MyComponent /> 表示同一文件夹中mycomponent.js文件中的主要React组件。对于一个小组件,您将不需要Redux商店;只需将所有状态存储在组件中 this.state。添加更多可重用相同状态的组件时,Redux是一种非常好的方法。

请注意,您需要一些额外的设置才能使简单示例生效。 <MyComponent /> 是JSX,不是普通的Javascript。你需要像Babel这样的转换器将其转换为普通的js(作为奖励,它还支持ES6符号)。此外,不要忘记包括React和React-Dom!


4
2018-02-10 10:53



好吧,我已经说过我对此很好......这不是我的问题的答案,我想要超越基础并渲染许多不同的组件。我需要模仿扩展并包括树枝的功能 - Sébastien