简介
利用create-react-app、Bootstrap、react 创建SPA。
利用create-react-app 创建模版。
1 | create-react-app react-QA-app |
在项目目录下运行。
1 | npm start |
修改public/index.html
文件,利用Bootstrap 构建页面。
1 | <!doctype html> |
拆分成如下组件
- QuestionItem.js
- QuestionList.js
- QuestionForm.js
- QuestionApp.js
- ShowAddButton.js
将上述各个组件进行简单初始化
1 | import React, { Component } from 'react'; |
添加显示隐藏Form 表单的功能
功能描述:
- 点击“添加问题”显示表单
- 点击表单上的“取消”按钮隐藏表单
功能实现:
- 利用
this.state
进行实现,添加一个事件onToggleForm
- QuestionApp.js 文件中进行初始化
state
,同时提供1
2
3
4
5
6constructor(props){
super(props)
this.state = {
onToggleForm: false
}
}onToggleForm
方法在1
2
3
4
5onToggleForm(){
this.setState({
formDisplay: !this.state.formDisplay
})
}ShowAddButton
和QuestionForm
组件上添加组件属性1
2
3
4
5<ShowAddButton onToggleForm={()=>this.onToggleForm()}/>
<QuestionForm
formDisplay={this.state.formDisplay}
onToggleForm={()=>this.onToggleForm()}/>
<QuestionList /> - ShowAddButton.js 也需要添加相应的属性
1
<button id="add-question-btn" className="btn btn-success" onClick={()=>this.props.onToggleForm()}>添加问题</button>
- QuestionForm.js 上也要添加属性同时需要增加一个style
1
<button className="btn btn-default pull-right" onClick={()=>this.props.onToggleForm}>取消</button>
1
2
3
4
5let styleObj = {
display: this.props.formDisplay ? 'block' : 'none'
}
return (
<form action="" className="clearfix" name="addQuestion" style={styleObj}>
提供默认的列表数据进行展示
- QuestionApp.js 中提供数据
this.state.questions
,将数据传入QuestionList 组件 - QuestionList.js 中接受
this.props.questions
进行数据的处理1
2
3
4
5
6<QuestionItem
key={q.id}
questionKey={q.id}
title={q.title}
desc={q.description}
voteCount={q.voteCount}/> - QuestionItem.js 中将每一个数据展示在对应的位置上
实现通过form 表单进行数据的添加
- QuestionApp.js 中提供
onNewQuestion
, 将其传入QuestionForm 组件 - QuestionForm.js 中处理onSumit 事件,在此事件方法中调用
onNewQuestion
方法
实现对点赞的事件处理
- QuestionApp.js 中提供
onVote
同时将此方法传入QuestionList 组件1
2
3
4
5
6
7
8
9
10
11
12onVote(key, newCount){
let newQuestion = this.state.questions.map(function(v, k, q){
if(v.id === key){
v.voteCount = newCount;
}
return v;
})
this.setState({
questions: newQuestion
})
}1
2
3<QuestionList
questions={this.state.questions}
onVote={(key, newCount)=>this.onVote(key, newCount)}/> - 在QuestionList 组件中,将其传入QuestionItem 组件
1
2
3
4
5
6
7
8
9let questionsComp = questions.map(function(q){
return <QuestionItem
key={q.id}
questionKey={q.id}
title={q.title}
desc={q.description}
voteCount={q.voteCount}
onVote={(key, newCount)=>onVote(key, newCount)}/>
}) - 在QuestionItem 组件中,在
voteUp
方法中进行调用在button 按钮上添加1
2
3
4voteUp(){
let newCount = parseInt(this.props.voteCount + 1,10)
this.props.onVote(this.props.questionKey, newCount)
}voteUp
事件1
<button className="btn btn-default" onClick={()=>this.voteUp()}>
对项目结构进行整理
- 拆分成如下结构
- components
- containers
- styles
- images
- index.js
- 如下图所示