【问题标题】:conditionally rendering pages from array data reactjs从数组数据reactjs有条件地渲染页面
【发布时间】:2018-10-10 21:34:02
【问题描述】:

所以我正在尝试使用 React 构建我的投资组合网站来练习。 我想让我的项目(当前从数组呈现)链接到项目概述页面,该页面将数组中的正确数据呈现到页面上。

const data = [
        {
    'name': 'Cady Studios',
    'date': 'January 2018',
    'type': 'UI/UX | Front End Development',
    'imageUrl': require('../images/projectOneImage.png'),
    'link': '',
    'brief': '',
    'tech': '',
},
    {
    'name': 'SWP Connect',
    'date': 'March 2018',
    'type': 'UI/UX',
    'imageUrl': require('../images/projectTwoImage.png'),
    'link': '',
    'brief': '',
    'tech': '',
},
{
    'name': 'Carzilla',
    'date': 'November 2017',
    'type': 'UI/UX',
    'imageUrl': require('../images/projectThreeImage.png'),
    'link': '',
    'brief': '',
    'tech': '',
},
{
    'name': 'Stone Mountain Park',
    'date': 'September 2017',
    'type': 'UI/UX',
    'imageUrl': require('../images/projectFourImage.png'),
    'link': '',
    'brief': '',
    'tech': '',
    }   
];


function Project(props){
return (
    <div>
        <a href={props.link} >
        <div className="project">
            <figure className="effect-sadie">
                <img className="projectImage img-fluid"
                    src={props.imageUrl}
                    alt={props.name}
                    />
                <figcaption>
                        <div className="projectInfoSmall">
                            <div className="projectType"><p>{props.type}</p></div>
                        </div>
                        <div className="projectTitle"><h2>{props.name}</h2></div>
                </figcaption>
            </figure>
        </div>
        </a>
    </div>
);
}

class ProjectsSection extends Component {
constructor(props) {
    super(props)
    this.state = {
        works: []
    }
}

componentWillMount() {
    this.loadWork()
}

loadWork() {
    const works = []
    data.map(item => works.push(item))
    this.setState({ works })
    setTimeout(() => {
        console.log(this.state)
    }, 2000)
}

render() {
    const projects = this.state.works.map((project, index) => <div className="grid"><Project 
            name={project.name}
            date={project.date}
            type={project.type}
            imageUrl={project.imageUrl}
            link={project.link}
            brief={project.brief}
            tech={project.tech}
            key={index}
        /></div>)

    return (
        <div className="container">
            <div className="project-section">
                <h2>Recent Projects</h2>
                    { projects }
                </div>
            </div>
    )
}
}

我假设我需要使用一些条件渲染来获得我想要的东西,但我不确定从哪里开始。 我试图创建概述模板,但感觉我遗漏了一些东西。我知道在链接到页面时我需要 ReactRouter 的帮助,但除此之外我被困住了!任何帮助将不胜感激! Link to Github

function ProjectsTemplate(props) {
return(
        <div>
            <div className="projectHero">
                <div className="projectHeading">
                    <h1>{props.name}</h1>
                    <div className="projectInfoLeft">
                        <div className="projectRole">
                            <h5>Role</h5>
                            <p>{props.type}</p>
                        </div>
                        <div className="projectTech">
                            <h5>Tech</h5>
                            <p>{props.tech}</p>
                        </div>
                        <div className="projectDate">
                            <h5>Date</h5>
                            <p>{props.date}</p>
                        </div>
                    </div>
                    <div className="projectInfoRight">
                        <div className="projectBrief">
                            <h5>Brief</h5>
                            <p>{props.brief}</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    );
}

class ProjectsPage extends Component {
render() {
    return(
        <div>
            <div className="container">
                <Header />
                <ProjectsTemplate />
            </div>
        </div>
    );
}
}

【问题讨论】:

  • 你得到什么渲染了吗?
  • 是的,我已经在主页上正确呈现了项目。就是不知道怎么把项目数据也传到项目概览页面,具体看首页点击的是哪个项目。
  • 你在项目的div中定义了onClick吗?这个 onclick 应该会切换到项目的路由。
  • 我还没有定义 onClick 处理程序。这会包装整个项目div吗?你认为你可以提供一个例子或给我一个例子吗?感谢您的帮助

标签: reactjs react-router


【解决方案1】:

我相信以下是正确的方向......它不是完整的代码,但它给出了这个想法。我没有测试代码,如果需要,我让你做任何更改。

然而,这并不完整,因为它只传递了项目 ID,而不是完整的对象。我从来没有做过这样的事情,但以下似乎提供了一个解决方案: How to pass parameters in react-router-dom Link?

现在进行更改。

首先将ProjectsSection.js 拆分为两个文件:一个包含ProjectsSection 组件,另一个包含Project 组件。

在 App.js 中,包含两个单独的组件,然后将现有代码(如果相关)更改为以下代码:

import { BrowserRouter, Route, Switch } from 'react-router-dom';

和:

  <BrowserRouter>
        <Route path="/" component={Header} />
        <Route path="/" component={Hero} />
        <Switch>
          <Route exact path="/" component={ProjectSection} />
          <Route path="/Projects/:projectId" component={Project} />
      </Switch>
  </BrowserRouter>

Project组件中,通过以下方式提取项目编号:

const projectId = this.props.match.params.projectId;

现在用对象替换 id...

【讨论】:

  • 很棒的反馈@Rahamin。感谢您花时间举例说明!这让我更清楚地了解需要什么。谢谢!
  • 当然。希望它有效。我只是想给你一个钩子,没有时间给你鱼:) BTW,如果你使用redux,你只能传递数字,两个组件都可以访问全局状态...
  • 所以经过一天的修修补补,我走得更远了,但不断遇到错误。当添加这个 const projectId = this.props.match.params.projectId;我收到一条错误消息,指出“无法读取未定义的属性'props'。而且我想我盯着这句话“用对象替换 id”太让我困惑了。如果可以,你能详细说明一下关于那个?事情似乎正在呈现,并且路由器工作正常。只是来自数组对象的数据没有被传递到项目页面。
  • 我到了某个地方。缓慢而稳定。我现在已经让项目根据它们的 id 将正确的信息呈现到单独的页面中。现在进入 onClick 事件! :)
  • 刚看到您 9 小时前的消息...我从未传递过一个对象,所以它也需要我时间.. 但是您 2 小时前的消息似乎表明您正在这样做自己。根据我的经验,与事情作斗争并自己解决问题在接下来的项目中会有所回报。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 2021-01-10
  • 2017-03-06
  • 2017-12-16
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
相关资源
最近更新 更多