45_redux_comment应用_redux版本_异步功能
/* * 包含所有action的type名称常量 * */ //添加评论 export const ADD_COMMENT = 'add_comment'; //删除评论 export const DELETE_COMMENT = 'delete_comment'; //接收评论数组 export const RECEIVE_COMMENTS = 'receive_comments'; export const INCREMENT = 'increment';
action-types.js
/*
* 包含了所有的action creator(action的工厂函数)
* */
import {ADD_COMMENT, DELETE_COMMENT, RECEIVE_COMMENTS} from './action-types'
// 同步添加
export const addComment = (comment) => (
{type: ADD_COMMENT, data: comment}
)
// 同步删除
export const deleteComment = (index) => (
{type: DELETE_COMMENT, data: index}
)
// 同步接收comments
const receiveComments = (comments) => ({
type: RECEIVE_COMMENTS,
data: comments
})
// 异步从后台获取数据
export const getComments = () => {
return dispatch => {
// 模拟发送ajax请求异步获取数据
setTimeout(() => {
const comments = [
{username: 'Tom', content: 'React挺好的!'},
{username: 'Jack', content: 'React太难了!'},
{username: 'Jensen', content: '干就完了!'}
]
//分发一个同步的action
dispatch(receiveComments(comments))
}, 1000)
}
}
actions.js
/*
* 包含n个reducer函数(根据老的state和action返回一个新的state)
* */
import {combineReducers} from 'redux'
import {ADD_COMMENT, DELETE_COMMENT, RECEIVE_COMMENTS, INCREMENT} from './action-types'
function counter(state = 0, action) {
console.log('counter()', state, action)
switch (action.type) {
case INCREMENT:
return state + action.data
case DELETE_COMMENT:
return state - action.data
default:
return state
}
}
const initComments = []
function comments(state = initComments, action) {
switch (action.type) {
case ADD_COMMENT:
return [action.data, ...state]
case DELETE_COMMENT:
return state.filter((comment, index) => index !== action.data)
case RECEIVE_COMMENTS:
return action.data
default:
return state
}
}
export default combineReducers({
counter, //指定reducer对应的属性
comments
})
// redux向外暴露的state是什么结构?
// 是一个对象{counter:2,comments:[]}
reducers.jsx
/*
* redux最核心的管理对象store
* */
import {createStore, applyMiddleware} from 'redux'
import reducers from './reducers'
import thunk from 'redux-thunk'
export default createStore(
reducers,
applyMiddleware(thunk)
)
store.js
import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux'
import store from './redux/store'
import App from './containers/app/app'
ReactDOM.render((
<Provider store={store}>
<App/>
</Provider>
), document.getElementById('root'));
index.js
import React from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import CommentAdd from '../../components/comment-add/comment-add'
import CommentList from '../../components/comment-list/comment-list';
import {addComment, deleteComment, getComments} from '../../redux/actions'
class App extends React.Component {
//定义数据
static propTypes = {
comments: PropTypes.array.isRequired,
addComment: PropTypes.func.isRequired,
deleteComment: PropTypes.func.isRequired,
getComments: PropTypes.func.isRequired
}
componentDidMount() {
//异步获取所有评论数组
this.props.getComments()
}
render() {
const {comments, addComment, deleteComment} = this.props
return (
<div>
<header className="site-header jumbotron">
<div className="container">
<div className="row">
<div className="col-xs-12">
<h1>请发表对React的评论</h1>
</div>
</div>
</div>
</header>
<div className="container">
<CommentAdd addComment={addComment}/>
<CommentList comments={comments} deleteComment={deleteComment}/>
</div>
</div>
)
}
}
export default connect(
state => ({comments: state.comments}),// 说明state就是comments数组
{addComment, deleteComment, getComments}
)(App)
app.jsx
45_redux_comment应用_redux版本_异步功能的更多相关文章
- 44_redux_comment应用_redux版本_同步功能
项目结构: components里面的东西没变,将app.jsx移动至containers中 /* * 包含所有action的type名称常量 * */ //添加评论 export const ADD ...
- Spring异步功能
使用 Spring 的异步功能时,实质是使用的 Servlet3 及以上版本的异步功能. Spring 的异步处理机制需要在 web.xml 中全部的 servlet 和 filter 处配置 < ...
- C#各版本新增加功能
本系列文章主要整理并介绍 C# 各版本的新增功能. C# 8.0 C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual Studio 2019 一同发布,但是当前 ...
- 【转】C#各版本新增加功能
本系列文章主要整理并介绍 C# 各版本的新增功能. C# 8.0 C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual Studio 2019 一同发布,但是当前 ...
- oracle_单向函数_数字化功能
oracle_单向函数_数字化功能 1.abs(x) 为了获得x绝对值 2.ceil(x) 用于获得大于或等于x的最小整数. 3.floor(x) 用于获得小于或等于x 4.mod(x,y ...
- python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...
- java web开发_购物车功能实现
java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...
- unix网络编程第2版(卷1)_第6章_同步_异步
第6章 I/O复用:select和poll函数 6.1概述 在5.12节中,我们看到TCP客户同时处理两个输入:标准输入和TCP套接口.我们遇到的问题是客户阻塞于(标准输入上的)fgets调用,而服务 ...
- 爬虫必知必会(4)_异步协程-selenium_模拟登陆
一.单线程+多任务异步协程(推荐) 协程:对象.可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象 ...
随机推荐
- java的接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...
- JAVA工具类-StrUtils
public class StrUtils { public static final String UTF_8 = "UTF-8"; /** * 去掉小数字符串后面无用的零 */ ...
- Vue通过路由 query传递参数
父组件通过query来传递num参数为1,相当与在 url 地址后面拼接参数 <template> <div> <h3>首页</h3> <rout ...
- c# 获取 com 引用真实组件地址
1.根据guid获取 var clsid = new Guid("63EA2B90-C5A8-46F4-8A6E-2F2436C80003").ToString("B&q ...
- EF框架引用问题
安装EF框架时,从NuGet上安装 EF 安装完成以后仍然报错误 这个错误 是因为EF实体数据模型未引用System.data.entity 这个DLL ,记一下以防止以后忘记
- Reactor和Proactor
服务器编程框架 IO处理单元 :处理用户连接,读写网络数据:(单机) :作为接入服务器,实现负载均衡;(集群) 请求队列 :各个单元之间通信的抽象,通常被实现为池的一部分:一个单元通知另外一个单元,或 ...
- 2018-2019-2 网络对抗技术 20165308 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165308 Exp3 免杀原理与实践 实践内容(3.5分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分) ...
- 剑指offer 11. 位运算 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 private stat ...
- Internet Explorer 安全区域注册表项说明
引用网址:http://support.microsoft.com/kb/182569/zh-cnInternet Explorer 安全区域设置存储在以下注册表子项下面: HKEY_LOCAL_MA ...
- 远程访问服务器tensorboard
转自https://blog.csdn.net/Hansry/article/details/83004648 1. 在登录远程服务器的时候使用命令: : server_name@server.add ...