react与dva

1.变量声明

const DELAY = 1000

let count = 0
count = count + 1

2. 模板字符串

const user = 'world'
console.log(`hello ${user}`) // 多行 const content = `
hello ${user}
thanks for you ${user}
`
console.log(content)

3. 默认参数


function logActivity(activity = 'skiing'){
console.log(activity)
} logActivity() ;// skiing

4. 箭头函数

[1, 2, 3].map(x => x + 1) // [2,3,4]

// 等同于

[1, 2, 3].map((function(x) {
return x + 1;
}).bind(this));

5. 模块的Import 和 Export


import dva from 'dva' import {connect} from 'dva' import * as service from './services' export default App export class App extends Component{}

6. ES6对象和数组

6.1 析构赋值

// 对象
const people = {name:'kk',age:12}
const { name , age } = people
console.log(`${name}:${age}`) // 数组
const arr = [1,2]
const [foo,bar] = arr
console.log(foo) // 函数
const add = (state,{payload}) => {
return state.concat(payload)
} // alias别名
const plus = (state,{payload:todo}) => {
return state.concat(todo)
}

6.2 对象字面量

const n = 'kk'
const a = 8 const u = {n , a} // 定义对象的方法时,可省略去function app.model({
reducers:{
add(){} // <=> add: function() {}
},
effects:{
*addRemote() {} // <=> addRemote: function() {}
}
})

6.3 展开符 Spread Operator

// 组装数组
const array = ['add']
// [...array,'remove'] // 获取部分项
function directions(first,...rest){
console.log(rest)
}
console.log(directions('a','b','c')) // 代替apply function fun(x,y,z){
console.log(y)
}
const args = [1,2,3] fun.apply(null,args)
// 等同于
fun(...args) // 合成新的object const old = {
a:1
}
const change = {
b:2
} const ret = {...old , ...change}

6.4 Promises


fetch('/api/todos')
.then(res => res.json())
.then(data => ({data}))
.catch(err => ({err})) // 定义promise
const delay = (timeout) => {
return new Promise(resolve => {
setTimeout(resolve,timeout)
})
} delay(1000).then(_ => {
console.log('executed')
})

6.5 Generators 生成器

/*
概述:dva 的 effects 是通过 generator 组织的。Generator 返回的是迭代器,通过 yield 关键字实现暂停功能。
这是一个典型的 dva effect,通过 yield 把异步逻辑通过同步的方式组织起来。
*/ app.model({
namespace:'todos',
effects:{
*addRemove({payload:todo},{put,call}){
yield call(addTodo,todo)
yield put({type:'add',payload:todo})
}
}
})

————————————————-重要内容—————————————————

7. React Component

7.1 组件定义的方式

函数

7.2 JSX

7.2.1 扩充组件的props

const attrs = {
href : 'http://exm.org',
target:'_blank'
}
<a {...attrs}>hello</a>

7.3 Props

7.3.1 propTypes
// 概念:由于js是弱类型语言,声明propTypes对props进行校验是有必要的

function App (props){
return <div>{props.name}</div>
} App.propTypes = {
name:React.PropTypes.string.isRequired
}

7.4 Css Modules


.title {
color: red;
}
:global(.title) {
color: green;
}

//然后在引用的时候:
<App className={styles.title} /> // red
<App className="title" /> // green

7.5 classnames Package

/*
概念:在一些复杂的场景中,一个元素可能对应多个 className,而每个 className 又基于一些条件来决定是否出现。
这时,classnames 这个库就非常有用。
*/ import classnames from 'classnames'
const App = (props) => {
const cls = (props) => {
btn : true,
btnLarge:props.type === 'submit',
btnSmall:props.type === 'edit'
}
return <div classNames={cls}>
} //这样传入不同的type给App组件,就会返回不同的className组合
<App type='submit'/>
<App type='edit'/>
7.6 Reducer
// 增删改 以todo为例

app.model({
namespace:'todos',
state:[],
reducers:{
add(state,{payload:todo}){
return state.concat(todo)
},
remove(state,{payload:id}){
return state.filter(todo => todo.id !== id)
},
update(state,{payload:updatedTodo}){
return state.map(todo=>{
if(todo.id === updatedTodo.id){
return {...todo,...updatedTodo}
}else{
return todo
}
})
}
}
})

// 嵌套数据的增删改 app1.model({
namespace:'app',
state:{
todos:[],
loading:false,
},
reducers:{
add(state,{payload:todo}){
const todos = state.todos.concat(todo)
return {...state,todos}
}
}
})

7.7 Effect


app2.model({
namespace:'todos',
effects:{
*addRemove({payload:todo},{put,call}){
yield call (addTodo,todo)
yield put({type:'add',payload:todo})
}
}
})
7.7.1 put 用于出发action

yield put({ type: 'todos/add', payload: 'Learn Dva' }); // 7.7.2 call 用于调用异步逻辑 支持promise const result = yield call(fetch, '/todos'); // 7.7.3 select 从state中获取数据 const todos = yield select(state => state.todos)
7.7.3 错误的处理
app.model({
effects: {
*addRemote() {
try {
// Your Code Here
} catch(e) {
console.log(e.message);
}
},
},
});

7.8 异步请求 whatwg-fetch

fetch学习地址: https://github.com/github/fetch

7.8.1 get 和 post

import request from '../util/request'

//get
request('/api/todos') // post request ('/api/todos',{
methods:'post',
body:JSON.stringify({a:1})
})

7.9 Subscription 订阅 异步数据的初始化

app.model({
subscriptions:{
setup({dispatch,history}){
history.listen(({pathname})=>{
if(pathname === 'users'){
dispatch({
type:'users/fetch'
})
}
})
}
}
})

7.10 路由 基于action进行页面跳转

import {routerRedux} from 'dva/router'
// inside effects
yield put(routerRedux.push('/logout'))
// outside effects
dispatch(routerRedux.push('/logout'))
// with query
routerRedux.push({
pathname:'/logout',
query:{
page:2,
}
})

8.0 dva的配置

8.1 Redux Middleware 添加中间件


import createLogger from 'redux-logger' const app = dva ({
onAction:createLogger() // onAction支持数组,可同时传入多个中间件
}) // history 切换history为browserHistory import {browserHistory} from 'dva/router'
const ap = dva({
history:browserHistory
}) //去除 hashHistory 下的 _k 查询参数 import { useRouterHistory } from 'dva/router';
import { createHashHistory } from 'history';
const app2 = dva({
history: useRouterHistory(createHashHistory)({ queryKey: false }),
});

9.0 工具

9.1 通过dva-cli创建项目


$ npm i dva-cli -g # 安装dva-cli
$ dva new myapp # 创建项目
$ cd myapp
$ npm start # 启动项目

DVA知识集合的更多相关文章

  1. python易错知识集合

    本篇用于记录在写leetcode时遇到的python易错知识. 2019.8.29 1.Python range() 函数用法: range(start, stop[, step]) start: 计 ...

  2. Java基础知识➣集合整理(三)

    概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...

  3. Java基础知识--集合

    集合类 数组和集合的比较:数组可以存储对象,也可以存储基本数据类型,但是缺点就是长度固定,不能改变:集合长度是可变的,但是集合只能存储对象,集合可以存储不同类型的对象. Java容器类库一共有两种主要 ...

  4. 面试基础知识集合(python、计算机网络、操作系统、数据结构、数据库等杂记)

    python python _.__.__xx__之间的差别 python中range.xrange和randrange的区别 python中 =.copy.deepcopy的差别 python 继承 ...

  5. python知识集合

    1.list list是一种有序的集合 例子:classmates = ['Michael', 'Bob', 'Tracy']; 方法:1. len len(classmates) //3 2.app ...

  6. python基础知识-集合,列表,元组间的相互装换

    在python中列表,元祖,集合间可以进行相互转化, def main(): set1={'hello','good','banana','zoo','Python','hello'} print(l ...

  7. cocopods 知识集合 及 一个 好的 国外iOS技术翻译站

    http://www.exiatian.com/cocoapods%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E5%8F%8A%E9%85%8D%E7%BD%AE%E7% ...

  8. 从壹开始 [ Id4 ] 之二║ 基础知识集合 & 项目搭建一

    前言 哈喽大家又见面啦,感觉好久没更新了,这几天看了一本书<解忧杂货铺>,嗯挺好的,推荐一下

  9. js数组相关知识集合

    一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...

随机推荐

  1. RTEMS进程同步机制

    互斥量 好像没有互斥量,信号量接收那儿有个图,互斥量似乎术语一类特殊的信号量. 信号量 12. Semaphore Manager 12.1. Introduction The semaphore m ...

  2. 一步步搭建jumpserver

    测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7 IP: 192.1 ...

  3. CoachAI 2019年12月~2020年3月实习总结

    CoachAI 2019年12月~2020年3月实习总结 一句话总结: 方向对口,大有所得. CoachAI公司简介   CoachAI是一家做在线健身的公司,目前在手机端和IOS端都有自己的服务,并 ...

  4. ASP.NET Core ResponseCache进行缓存操作

    前言 本章将介绍客户端缓存将介绍浏览器缓存和服务端缓存,使用浏览器缓存将减少对web服务器的请求次数,同时可以提升性能,避免重复的运算浪费. ASP.NET Core对于HTTP缓存分为两种: 客户端 ...

  5. 数组和CLR-非常特殊的关系

    目录 数组和CLR-非常特殊的关系 公共语言运行时(CLR)的基础 内存和类型安全 实现细节 特殊帮助器类 移除边界检查 分配数组 运行时以不同的方式对待数组 进一步阅读 数组源码引用 参考文档 数组 ...

  6. windows快捷键记录

    -1: 装完iis, run -> inetmgr 弹出iis管理器 0.按住Shift键右击鼠标打开命令行窗口 1.ODBC数据源管理器run->odbcad32 2.计算机管理(查看设 ...

  7. 仁和药业顺利出局,布局地产万科A

    仁和药业布局到第二单,被止盈了,盈利大约1.1%.这几日地产行业回调明显,所以布局了万科A. 资金量W11.8 建仓价格28.6 加仓系数1.5 加仓间隔2.70% 总盈利比6.50% 期待吧!

  8. 传智播客C++视频学习笔记(3)

    #include<iostream> using namespace std; //内存分区模型 //代码区,存放二进制代码,由操作系统进行管理 //全局区,存放全局变量.静态变量.常量( ...

  9. 二、Nginx配置实例

    Nginx配置实例 一.反向代理 实例一 1.实现效果 打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到linux系统tomcat主页面中. 2.准备工作 在linux系统中安装t ...

  10. Android在Activity中与Fragment中创建自定义菜单的区别

    区别就在这里,Activity中添加菜单要这样: public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R ...