javascript - React-Router - 显示特定 ID 的详细信息

标签 javascript arrays reactjs react-router

我正在使用react-router制作一个简单的作品集。

我有一个索引页"/"和一个作品页"trabalhos/",显示我的所有作品。

目标是当我单击作品页面上的“显示更多”按钮时,我想转到仅显示该作品的单个页面。

我正在使用<Route path="trabalhos/:id" component={TrabalhosShow} />通过 props 将 id 传递到我的新页面。

现在的目标是展示该工作的细节。

需要帮助。

谢谢

routes.js

import React from 'react';
import { Route, IndexRoute } from 'react-router';

import App from './components/app';
import Index from './components/index';
import Trabalhos from './containers/trabalhos';
import TrabalhosShow from './containers/trabalhos_show';

export default (
<Route path="/" component={App}>
    <IndexRoute component={Index} />
    <Route path="trabalhos" component={Trabalhos}/>
    <Route path="trabalhos/:id" component={TrabalhosShow} />
</Route>
);

trabalhos.js(作品列表)

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Link, browserHistory } from 'react-router';


class Trabalhos extends Component {
        handleClick(trabalho){
            browserHistory.push({
                pathname: "trabalhos/" + trabalho.id,
                state: {trabalhoDetails: trabalho}
            });
    }

    renderList(){

        return this.props.trabalhos.map((trabalho) => {
            return(

                <li key={trabalho.id}>                 
                        <img src={trabalho.img} />
                        <p className="trabalho_titulo">{trabalho.title}</p>
                        <p className="trabalho_desc">{trabalho.descricao}</p>
                        <span className="trabalho_saber_mais" onCLick={this.handleClick.bind(this, trabalho)}>Saber Mais</span>
                </li>

            );
        });
    }


    render(){

        return (

            <div>
                <div className="trabalhos">
                    <div className="trabalhos_caixa">
                        <div className="row">
                            <div className="col-xs-12">
                                <ul className="no_pad">
                                    {this.renderList()}
                                </ul>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        );
    }
}


function mapStateToProps(state){

    return {

        trabalhos: state.trabalho

    };
}



export default connect(mapStateToProps)(Trabalhos);

trabalhos_show.js(单个作品)

import React, { Component } from 'react';
import { connect } from 'react-redux';

class TrabalhosShow extends Component {


    render(){

        let jobDetails = this.props.location.state.trabalhoDetails

        let title = jobDetails.title;

        let desctription = jobDetails.descricao;

        return (

                <div>
                    <img src={jobDetails.img} />
                    <p className="trabalho_titulo">{title}</p>
                    <p className="trabalho_desc">{descricao}</p>
                </div> 
            );
    }

}

function mapStateToProps(state){
   return {
       trabalhos: state.trabalho
   };
}

export default connect(mapStateToProps)(TrabalhosShow);

reducer_trabalhos

export default function() {

    return [

        { id: 1, title: 'Miristica', tec: "Wordpress-Woocommerce", descricao: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", img: 'http://feiraalternativa.pt/wp-content/uploads/2016/04/Miristica-Bio-Cosm%C3%A9tica.png'},
        { id: 2, title: 'Teste', tec: "Wordpress-Woocommerce", descricao: "Lorem ipsum dolor sit amet", img: 'https://pbs.twimg.com/profile_images/766360293953802240/kt0hiSmv.jpg'},

    ];

}

reducer Index.js

import { combineReducers } from 'redux';
import TrabalhoPortofolio from './reducer_trabalhos';

const rootReducer = combineReducers({
    trabalho: TrabalhoPortofolio
});

export default rootReducer;

谢谢!

最佳答案

将您的详细信息页面连接到 redux 存储并通过 ID 进行过滤。

您的 trabalhos_show.js 应如下所示:

import React, { Component } from 'react';
import { connect } from 'react-redux';

class TrabalhosShow extends Component {


    render(){
        let jobDetails = this.props.trabalhos.filter( t => t.id == this.props.params.id)[0];
        return (
                <div>
                    <img src={jobDetails.img} />
                    <p className="trabalho_titulo">{jobDetails.title}</p>
                    <p className="trabalho_desc">{jobDetails.descricao}</p>
                </div> 
            );
    }

}

function mapStateToProps(state){
   return {
       trabalhos: state.trabalho
   };
}

export default connect(mapStateToProps)(TrabalhosShow);

另一个解决方案是添加 onClick 事件并通过 browserHistory 传递作业详细信息。

在 trabalhos.js 中,您应该将链接更改为:

<span className="trabalho_saber_mais" onCLick={this.handleClick.bind(this, trabalho)}>Saber Mais</span>

它应该看起来像这样:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Link, browserHistory } from 'react-router';


class Trabalhos extends Component {
        handleClick(trabalho){
            browserHistory.push({
                pathname: "trabalhos/" + trabalho.id,
                state: {trabalhoDetails: trabalho}
            });
    }

    renderList(){

        return this.props.trabalhos.map((trabalho) => {
            return(

                <li key={trabalho.id}>                 
                        <img src={trabalho.img} />
                        <p className="trabalho_titulo">{trabalho.title}</p>
                        <p className="trabalho_desc">{trabalho.descricao}</p>
                        <span className="trabalho_saber_mais" onClick={this.handleClick.bind(this, trabalho)}>Saber Mais</span>
                </li>

            );
        });
    }


    render(){

        return (

            <div>
                <div className="trabalhos">
                    <div className="trabalhos_caixa">
                        <div className="row">
                            <div className="col-xs-12">
                                <ul className="no_pad">
                                    {this.renderList()}
                                </ul>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        );
    }
}


function mapStateToProps(state){

    return {

        trabalhos: state.trabalho

    };
}



export default connect(mapStateToProps)(Trabalhos);

然后在 trabalhos_show.js 中,您可以使用通过 browserHistory 传递的状态,如下所示:

let jobDetails = this.props.location.state.trabalhoDetails

然后你就可以获得 trabalho 中的所有内容,例如:

let title = jobDetails.title;
let desctription = jobDetails.descricao;

希望这有帮助。

关于javascript - React-Router - 显示特定 ID 的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763919/

相关文章:

javascript - 如何使用 rollup.js 将所有依赖项嵌入到一个胖目标包中?

javascript - jQuery parent() 函数返回空

java - 如何从信号/阵列中剪切出模式?

python - 如何在对数组应用花式索引过滤器的同时将数组的一列放入新数组中?

java - 列表无法转换为数组的原因是什么?

reactjs - Firebase 错误.. 错误 : Failed to make request to https://www. gstatic.com/firebasejs/releases.json

javascript - 在javascript中重复数组中的相同元素

javascript - 正则表达式在逗号和单词之间获取空格

javascript - 错误 TS2339 : Property 'Default' does not exist on type 'string' . **

javascript - 即使我没有显式使用 React,为什么也需要 import React 语句?