【问题标题】:Switching between similar routes in React Router在 React Router 中的相似路由之间切换
【发布时间】:2015-09-12 04:23:16
【问题描述】:

我有这种路线:

<Route name="itemDetails" handler={ItemDetails} path="/item/:itemId"/>

它指向包含完整产品描述的页面。 “相关项目”很少。它们中的每一个都包含指向不同“itemDetails”页面的链接。当我单击此链接之一时,浏览器地址栏中的路线正在更改,但内容没有。 为什么?其余路线运行良好。 另外,如果我重新加载页面,内容会刷新,并且会与浏览器地址栏中的路线相匹配

这可能是因为不正确的 url 监听器 它试过这个:

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

还有这个:

Router.run(routes, Router.HashLocation, function (Root) {
  React.render(React.createElement(Root, null), document.body);
});

这里是itemDetails代码:

var React = require('react');
var Store = require('../../stores/app-store');
var Preloader = require('../template/app-preloader');
var NewEstateItem = require('./app-newestateitem');
var NewEstateRelated = require('./app-newestaterelated');

var NewEstateDetails = React.createClass({




    getInitialState: function() {
    return { item: null };
  },


  componentWillMount: function() {
    itemId = this.props.params.itemId;
    console.log('ItemId:', itemId);
    Store.getNewEstateById(itemId,this._getNewEstateDetails);
  },

    render: function() {
        var item = this.state.item;
    if(!item) {
      return (<Preloader />);
    }
        return (
            <div className="row">
                <div className="container flex-container">
                    <div className="col s12 m12 l8">
                        <div className="col s12">
                            <h4>{item.Name}</h4>
                        </div>
                    <div className="col l4 hide-on-med-and-down margintop">
                    <h5 className="center">Related items</h5>
                        <div className="col s12">
                            <NewEstateRelated Price={item.Price}/>      
                        </div>
                    </div>
                </div>
            </div>
        );
    },

    _getNewEstateDetails: function (item) {
    this.setState({item:item});
  }

});

module.exports = NewEstateDetails;

这里还有相关的物品链接代码:

<Link to="ItemDetails" params={{itemId: item.objectId, CustomID: item.CustomID}} className="btn</Link>

这里是商店:

var getNewEstateData = {

  getNewEstateById: function(objectId, callback) {
    console.log('store.objectId', objectId);
    function NewEstateData() {};
    var item = Backendless.Persistence.of( NewEstateData ).findById( objectId );
    console.log("store.getNewEstateById", item);
    callback(item);
  },

  getAllNewEstate: function(callback) {
    function NewEstateData() {};
    var items = Backendless.Persistence.of( NewEstateData ).find().data;
    callback(items)
  },

  getRelatedNewEstateItems: function (priceBottom, priceTop, callback) {
    function NewEstateData() {};
    var items = Backendless.Persistence.of( NewEstateData );
    var dataQuery = {
      condition: "Price >= "+priceBottom
    }
    var query = items.find( dataQuery ).data
    var output = query.slice(0,3)
    console.log('relatedItems', query);
    callback(output)
  }
};

module.exports = getNewEstateData;

【问题讨论】:

  • 如果您从 ItemDetails 发布代码会有所帮助。你在 render 方法中对 router.getCurrentParams().id 做了什么吗?
  • 关于这个:router.getCurrentParams().id 我不知道。我应该怎么做?
  • 这可能是 componentDidMount 仅在第一次渲染时被调用,并且这是使用所选项目更新状态的唯一地方 - 看起来 router.getCurrentParams().itemId 与做的相同this.props.params.itemId
  • 如何添加监听器,这将触发路径更改的某些方法?

标签: reactjs flux react-router


【解决方案1】:

我认为这是问题所在:

您的路由器正在等待:id:

<Route name="itemDetails" handler={ItemDetails} path="/item/:id"/>

但是你在&lt;link&gt;中发送itemId

<Link to="ItemDetails" params={{itemId: item.objectId, CustomID: item.CustomID}} className="btn</Link>

我很确定它应该匹配并且是:

<Link to="ItemDetails" params={{id: item.objectId, CustomID: item.CustomID}} className="btn</Link>

请参阅here 的文档,其中的示例证实了这一点:

params:与您的路由路径中的动态段相对应的名称/值的对象。

文档示例

// given a route config like this
<Route name="user" path="/users/:userId"/>

// create a link with this
<Link to="user" params={{userId: "123"}}/>

// though, if your user properties match up to the dynamic segements:
<Link to="user" params={user}/>

【讨论】:

  • 对不起,我的错 - 这个描述中的错字。我已经改正了
  • 你确定store里面的数据不一样?我唯一能想到的是,您的商店实际上返回的是相同的数据,因此 UI 不会更新。
  • checked:存储中的数据没有不同。为什么?
  • 我不知道为什么你的商店没有返回不同的内容......没有看到所有的代码,我无法帮助你。看起来这个问题有点无效,因为路线确实有效,是你的商店没有!
  • 张贴您的商店和其他相关代码,看看它是否有助于破译问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2016-09-15
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多