【问题标题】:Nested routes (/:foo/:bar) with parameters do not render, why?带参数的嵌套路由(/:foo/:bar)不渲染,为什么?
【发布时间】:2015-08-11 07:49:08
【问题描述】:

所以,我不确定我是否应该以不同的方式构建我的应用程序,或者我是否在做一些根本错误的事情。我有点困惑,但让我们先解释一下。

在第一个导航级别中,有 4 个页面 - 每个页面都有一个详细信息页面。

  • 首页
  • 第 1 类物品
    • 详情页
  • 第 2 类物品
    • 详情页
  • 第 3 类物品
    • 详情页

文章类别页面完全相同。它们都有一个包含 10-20 篇文章的列表 (<ul><li><Link></Link></li><li>...</ul>),所以我实际上只创建了一个组件,文章类别组件。

为了完成这项工作,应用程序的主导航包含<Link>,其中有一个名为page 的参数传递给文章类别 组件。根据此参数,视图在数组中查找文章并使用另一个组件将它们呈现为列表。

文章数组本身包含文章的名称和参数文章名称,f.e. 这是一篇文章。我将文章名称参数传递给详细信息组件,该组件根据此和页面参数查找正确的文章。

好的,我希望这很清楚。现在,这是我的 react-router 配置

export default (
    <Route path="/" handler={App}>
        {/* Home */}
        <DefaultRoute name="home" handler={Home}/>

        {/* Page */}
        <Route name="category" path=":category" handler={Category}>
            <Route name="category.article" path=":article" handler={Article} />
        </Route>

        {/* Not found */}
        <NotFoundRoute handler={NotFound} />
    </Route>
);

.. 但这不起作用。如果我单击具有正确参数的文章链接,则不会发生任何事情 - 好吧,URL 会更改,但没有其他任何内容......并且导航菜单项保持活动状态,这很好。我至少知道参数是正确的,因为当我将/* Page */ 下面的路由配置更改为:

    <Route name="category" path=":category" handler={Category} />
    <Route name="category.article" path=":category/:article" handler={Article} />

它可以工作,但是在我的主导航中,当我在文章(详细)页面上时,naivgation 项不再处于活动状态,我猜是因为它不再是子路由,所以上面的配置应该是正确的一个,但它不起作用..

下面是相关组件及其代码+内容数组/对象。请注意,显示的代码没有任何导入(我通过 Webpack 使用 ES6 和 Babel),但当然有一些。

文章组件(呈现文章本身)

let Article = React.createClass({
    getInitialState() {
        return {
            article: this.props.params.article,
            category: this.props.params.category
        }
    },
    componentWillReceiveProps(nextProps) {
        this.setState({
            article: nextProps.params.article,
            category: nextProps.params.category
        })
    },
    render() {
        let content = this._getContent();

        return (
            <div className="page_content page_content-article">
                <ArticleHeader />
                {content}
            </div>
        )
    },
    _getContent() {
        let item;

        for(item of ContentStore[this.state.category]) {
            if(item.name === this.state.article) {
                return item.content;
            }
        }
    }
});

Category 组件(使用 ArticleList 组件呈现文章列表,该组件仅使用类别和文章参数呈现,并且每个类别都相同)

let Index = React.createClass({
    getInitialState() {
        return {
            category: this.props.params.category
        };
    },
    componentWillReceiveProps(nextProps) {
        this.setState({
            category: nextProps.params.category
        });
    },
    render() {

        return (
            <div className={'page_content page_content-' + this.state.category}>
                <ArticleList articles={this._getArticles()} category={this.state.category} />
            </div>
        )
    },
    _getArticles() {
        return ContentStore[this.state.category];
    }
});

应用组件

let App = React.createClass({
    render() {
        return (
            <div className="page">
                <RouteHandler />
                <Navigation />
            </div>
        )
    }
});

PageStore(数据示例 - 呈现主导航)

PageStore: [
    {
        id: 1,
        title: 'Home',
        iconClass: 'home',
        linkTo: 'home',
        params: null
    },
    {
        id: 2,
        title: 'Category 1',
        iconClass: 'foo',
        linkTo: 'category',
        params: {
            category: 'foo',
        }
    },
    ...
]

ContentStore(数据示例 - 呈现文章列表和详细视图,因为它具有其内容)

ContentStore: {
    // "foo" is the category name
    foo: [
        {
            id: 1,
            name: 'article-1',
            linkText: 'Article 1',
            content: (
                <div>
                    lorem ipsum...
                </div>
            )
        },

    ]
} 

我有两个问题:

  • 我缺少什么以及如何完成这项工作?
  • 即使我可以,我是否应该真正完成这项工作,还是有更好的方法?我这样做是因为类别页面和详细信息页面除了内容之外没有任何区别,内容(还)来自一个简单的数组。

我还问我是否真的应该这样做,因为好吧.. 我从来没有看到嵌套路由,父母和孩子都有道具。也许这实际上是一件坏事。我不确定。如果您需要更多信息,我很乐意提供并提前感谢您。

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    在路径之前我从未见过: 的用法,我什至查看了文档以查看是否有示例但找不到,也许我错过了,: 用于据我所知的参数。无论如何,试试这个:

    <Route path="/" handler={App}>
        {/* Home */}
        <DefaultRoute name="home" handler={Home}/>
    
        {/* Page */}
        <Route path="category" handler={Category}>
            <Route path="category/article" handler={Article} />
        </Route>
    
        {/* Not found */}
        <NotFoundRoute handler={NotFound} />
    </Route>
    

    看看这是否能让页面现在正常工作,而不是从那里开始。

    【讨论】:

    • 感谢您的评论。是的, : 用于参数 - 在我的情况下, :category 和 :article 实际上是两个参数。如果我按照你写的那样做,它会起作用(我已经尝试过这个和类似的东西,比如 category/:article - 但是我必须为每个类别创建一个组件和路由......)但不会显示任何内容(这是有道理的,因为我从“商店”获取内容 - 并且需要参数来访问“商店”),它只是不适用于路径的第一和第二级中的参数你是对的,我也从未见过这样的例子......
    • .. 如果我对 :category 使用参数而不对文章使用参数,或者如果我对 :article 使用参数而不对类别使用参数 - 但不能同时使用两者,它会起作用。要么是要么,我不敢相信实际上不可能做到这一点。
    • 你能在 github 上发布一个带有链接的工作示例,以便我可以在本地进行测试吗?请包含使其在本地环境中工作所需的任何文件。
    • 您好 Hatem Jaber,我实际上找到了解决方案。我必须在我的类别页面中使用另一个 (所以我在 app.js 中有一个 ,在 {Category} 中有一个 - DefaultRoute 是我的列表视图)并重新构建我的应用程序有点。我在 JSFiddle 上找到了这个,试了一下,效果很好。老实说,我不知道为什么没有记录在案,或者这是否是执行此操作的“正确”方法:我将在下周回到工作岗位时发布更详细的答案。
    • 在我想在页面上有标签并更改标签和标签内容的情况下,我使用了嵌套的`'。据我所知,它是无证的,这是我们必须通过实验来解决的问题。在不离开当前模板的情况下嵌套内容是一件很有用的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2017-11-15
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多