【问题标题】:How to use React-Router with a model如何将 React-Router 与模型一起使用
【发布时间】:2015-04-19 18:26:47
【问题描述】:

React todomvc1 可以看出,确保 ui 与模型保持同步的一种方法是让模型订阅渲染函数(如下所示),以便 UI每次更改都会呈现。

function render() {
    React.render(
        <TodoApp model={model}/>,
        document.getElementById('todoapp')
    );
}

model.subscribe(render);
render();

如果在应用程序中使用 React 路由器,则必须将 React.render 调用包装在路由器中,如 showas shown by this demo

Router.run(routes, function (Handler) {
  React.render(<Handler/>, document.getElementById('example'));
});

那么,如果您还需要更新模型,您将如何使用路由器?即如何将React.render 包装在路由器和function render 中?这会产生范围问题

 function render() {
        Router.run(routes, function (Handler) {
        React.render(
            <TodoApp model={model}/>,
            document.getElementById('todoapp')
        );
        });
    }

    model.subscribe(render);
    render();

【问题讨论】:

  • 您能否提供更多关于您的 model 实例来自何处的上下文?解决方案的一部分是决定模型状态应该从哪里实例化以及它应该在哪里存在,因此可以从组件本身内部触发重新渲染。
  • @insin 对此感到抱歉,想一想,就像在 TodoMVC 演示中一样,那是我看到模型周围的包装器以更新 UI github.com/tastejs/todomvc/tree/master/examples/react/js
  • 您忘记添加链接,即 [1] 和 [2] 部分。
  • @QuyNguyen2013 抱歉,现在添加链接
  • @TomokoYamaguchi 有点晚,但请参阅下面的解决方案

标签: reactjs react-router


【解决方案1】:

我认为,如果您要创建一个完全反应的应用程序并使用反应路由器,那么我个人认为使用这种模型并不是最好的方法。最终我认为更好的解决方案是完全不使用这个模型,而只是使用 react 来处理所有的变化。但是,如果您要尝试使用现有模型和 react-router 执行此操作,我会在您的应用程序的根目录中引用 state 中的模型,然后将 setState 传递给模型订阅方法。
http://jsfiddle.net/xw8uc0nf/3/

var model = TodoModel

var App = React.createClass({

getInitialState: function(){
    return({localModel: model});
},
componentDidMount: function(){
    model.subscribe(this.updateModel.bind(this))
},

updateModel: function(){
    this.setState({localModel: model});
},
  render: function () {
    return (
      <div>
        <header>Super TODO app</header>
        <TodoApp model={@state.localModel} />
      </div>
    );
  }
});

ReactRouter.run(routes, function (Handler) {
  React.render(<Handler/>, document.body);
});

【讨论】:

  • +1 表示完全不使用模型。正如作者指出的那样,虽然这个解决方案有效,但它也有点奇怪。理解 Flux 和数据的单向流,让 React 的使用变得更加简单和强大。尝试摆脱模型,将您的 API 调用转移到您的操作中,使用调度程序,并使您的商店更精简:cask.scotch.io/2014/10/V70cSEC.png
猜你喜欢
  • 2018-12-30
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2018-02-03
  • 1970-01-01
  • 2018-07-28
  • 2023-03-17
相关资源
最近更新 更多