dva

dva 就是一个react的第三方框架 dva就是对redux进行简化

dva实质上 是集成了 react-router+redux+redux-saga 使用简便的语法来进行数据的统一状态管理

创建

  1. 全局下载 npm install -g dva-cli

  2. 查看版本 dva -v

  3. cd到指定文件夹下

  4. 创建项目 dva new 名字

  5. 启动 npm start

路由

1.在routes中创建对应的路由页面

2.在src下的router.js配置路由

import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import IndexPage from './routes/IndexPage';
// 1.引用
import Home from './routes/home';
​
function RouterConfig({ history }) {return (<Router history={history}><Switch><Route path="/" exact component={IndexPage} />{/* 2.配置使用 */}<Route path="/home" exact component={Home} /></Switch></Router>);
}
​
export default RouterConfig;

导航

声明式导航

import React, { Component } from 'react'
// 1.引用
import {Link} from "dva/router"
​
export default class topbar extends Component {render() {return (<div>{/* 2.使用导航 */}<Link to="/">点我去首页</Link></div>)}
}
​

编程式

this.props.history.push()import React, { Component} from 'react'
// 1.引用
import {Link,withRouter} from "dva/router"
​
class topbar extends Component {fun=()=>{// 编程式导航this.props.history.push("/")}render() {return (<div>{/* 2.使用导航 */}<Link to="/">点我去首页</Link><button onClick={this.fun}>点我去首页</button></div>)}
}
export default withRouter(topbar)

数据/状态管理

api1 model

model就是用来保存组件的数据与逻辑操作的 我们可以把数据独立到model中后器方便管理

1.models文件夹中 创建对应的模块文件

// 创建模块
export default {
​namespace: 'example',state: {
​},subscriptions: {},effects: {},reducers: {},};

2.在index.js中注册这个模块、

api2 state

1.在model中定义数据

// 创建模块
export default {
​namespace: 'example',state: {// 定义数据name:"xixi",age:18},subscriptions: {},effects: {},reducers: {},};

2.在哪里用 在哪里引用connect是一个函数当这个函数被调用的时候 返回 高阶组件

import React, { Component } from 'react'
// 1 引用connect
import {connect} from "dva"
import Tb from "../components/topbar.jsx"
class home extends Component {render() {return (<div>{/* 3.使用数据 */}home { this.props.state.homem.name}<Tb/></div>)}
}
// 2.使用connect连接数据
export default connect(state=>({state}))(home)

api3 reducers

修改state的数据 reducers中是一个个的函数 每个函数都是一个修改的动作i

// 创建模块
export default {
​namespace: 'homem',//命名空间state: {// 定义数据name:"xixi",age:18},subscriptions: {},effects: {},reducers: {//修改
​setname(state,payload){return {...state,name:payload.data}}},};
  

在页面中使用dispatch()触发reducers的修改

 fun=()=>{// this.props.dispatch({type:"命名空间/reducers的名字"})this.props.dispatch({type:"homem/setname",data:"我变了"})}

api4 effects

dva中请求数据

1.写在src文件夹下的services文件夹之下

2.在services新建一个文件 写入我们自己的请求

import request from '../utils/request';
​
export function query() {return request('http://www.weather.com.cn/data/cityinfo/101320101.html');
}

3.在自己的组件中测试请求 引用 使用

import React, { Component } from 'react'
// 1.引用
import {query} from "../services/homeapi.js"
export default class shop extends Component {componentDidMount() {// 2.使用query().then((ok)=>{console.log(ok);})}render() {return (<div><h1>数据请求</h1></div>)}
}

上面的请求地址是有跨域问题的

解决跨域

去找到.webpackrc 文件中写入如下内容

{
​"proxy":{"/api":{"target":"http://www.weather.com.cn","changeOrigin":true,"pathRewrite":{"^/api":"/"}}}
​
}

千万不要忘了修改请求地址为 /api 与重启

dva怎么请求异步数据

1.在effect中进行数据的请求发送

import {query} from "../services/homeapi.js"
// 创建模块
export default {
​namespace: 'homem',//命名空间state: {// 定义数据name:"xixi",age:18},subscriptions: {},effects: {//  1.新建一个effect函数用来容纳请求// call 就是用来包装请求的  并且返回成功的值*demolink({payload},{put,call}){// 2.引用请求// 3.使用请求let data=yield call(query)console.log(data)}},reducers: {//修改
​setname(state,payload){return {...state,name:payload.data}}},};

如何触发effects进行异步操作

this.props.dispatch({type:"命名空间的名字/effects的名字"})

import React, { Component } from 'react'
// 1.引用
// import {query} from "../services/homeapi.js"
​
import {connect} from "dva"class shop extends Component {// componentDidMount() {//     // 2.使用//     query().then((ok)=>{//         console.log(ok);//     })// }fun=()=>{// 触发effectsthis.props.dispatch({type:"homem/demolink"})}render() {return (<div><h1>数据请求</h1><button onClick={this.fun}>点我请求</button></div>)}
}
export default connect(state=>({state}))(shop)

3.把请求来的数据通过put() 传递给reducers进行修改

effects: {//  1.新建一个effect函数用来容纳请求// call 就是用来包装请求的  并且返回成功的值// put是用来触发reducers修改的*demolink({payload},{put,call}){// 2.引用请求// 3.使用请求let data=yield call(query)console.log(data.data.weatherinfo.city)
​// 4我们需要把请求来的数据交给reducers修改state// yield put({type:"reducers的名字",data:你传递的数据})yield put({type:"setname",data:data.data.weatherinfo.city})}},

4.新建对应的reducers来进行修改

reducers: {//修改
​setname(state,payload){return {...state,name:payload.data}}},

api5 subscriptions

subscriptions 相当与是一个监听器 他可以监听任何程序中的变化 比如 鼠标 键盘 服务器等变化 只要被监听 那么事件触发他就会被执行

 subscriptions: {demo(){window.onresize=()=>{console.log("变了")}}},

dva 路由/导航/相关推荐

  1. 前端学习(2705):重读vue电商网站26之路由导航守卫控制访问权限

    如果用户没有登录,但是直接通过URL访问特定页面,需要重新导航到登录页面. 在之前的操作中,我们登录之后会种植一个 token 值,表示我们登录成功了,那么此时我们将 token 值去掉呢? 直接点击 ...

  2. axios请求拦截器、响应拦截器、vue-router路由导航守卫的使用(案例)

    axios官方文档 一.请求拦截器 设置headers,给所有请求加上Authorization:token值 二.响应拦截器 直接去访问/article,发现可以进入到article内容管理页面 原 ...

  3. vue-router进阶:路由使用归纳、路由导航守卫、导航守卫解析流程、

    一.定义和理解 导航守卫的作用:vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航. >>项目中应用场景举例:路由页面跳转时候进行登陆验证:路由跳转判断: 有多种机会 ...

  4. Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装

    1.写在前面 最近在学习Vue2,遇到有些页面请求数据需要用户登录权限.服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文. 2. ...

  5. 网站安全配置---挂载路由导航

    视频地址: https://www.bilibili.com/video/BV1af4y1N78B 实现: 挂载路由导航-创建安全网站登录 代码: // 挂载路由导航守卫 router.beforeE ...

  6. Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装 1

    1.写在前面 最近在学习Vue2,遇到有些页面请求数据需要用户登录权限.服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文. 2. ...

  7. (转)Vue-初步了解vue-router的三要素:路由map 、路由视图、路由导航

    安装vue-router模块 使用vue-router前要先安装vue-router库 cnpm install vue-router –save 使用vue-router vue-router有三个 ...

  8. hach vue 跳转_Vue路由实现、路由导航、路由模式

    1.$router和$route区别 router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象,和router-link跳转一样,this. ...

  9. Vue - 路由导航守卫控制访问权限,设置 localStorage 过期时间

    Vue 路由导航守卫控制访问权限,设置 localStorage 过期时间 一. 路由导航守卫 二. 路由导航守卫 简单使用 三. 使用路由导航守卫设置 token 过期时间 导航守卫: https: ...

  10. vue + element-ui 对登录功能、重置表单、退出功能、路由重定向、挂载路由导航守卫的实现

    vue + element-ui 对登录功能.重置表单.退出功能.路由重定向.挂载路由导航守卫的实现 表单验证规则: 重置表单 和 对登录功能的验证: 路由重定向: 挂载路由导航守卫: 退出功能的实现 ...

最新文章

  1. [Server] 服务器配置SSH登录邮件通知
  2. Linux系统安装中文环境,中文帮助,中文输入法的实现
  3. 一篇不错的讲解Java异常的文章(转载)
  4. Linux 双显卡 黑屏,Ubuntu16.04安装 双显卡安装Nvidia驱动 登录循环 黑屏(通用 终结此类问题)转载...
  5. spring mvc学习(25):Eclipse设置代码自动提示
  6. 网页设计表格单元格线条及边框设置
  7. wordpress主题 阿里百秀XIU v7.7版本 兼容 PHP 8.0
  8. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题
  9. Windows 10搜集的用户隐私数据全部在此
  10. static library libs/libvpx/libvpx.a is not portable!
  11. M2Det的学习过程
  12. STM32 硬件I2C读写AT24C02/08
  13. JDBC的PreparedStatement接口
  14. 我的世界Minecraft Java开服教程(Windows)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器资源包
  15. 硬件工程师要学习的东西
  16. uniapp app 端打开pdf文件方式
  17. 【热血传奇】 添加新地图
  18. 【XSY3952】简单的计数题(dp)
  19. 面试题 02.08. 环路检测-快慢指针+如何找到环的入口?(证明)Java
  20. 硬解直显模式实现抓图功能(二)

热门文章

  1. TortoiseSVN删除前任账号,添加自己账号
  2. 【连载之一】那些公众号不会告诉你的职业真相
  3. 蓝牙连接不上车要hfp_hfp是什么意思车上
  4. 解决 win7 不支持此接口 问题
  5. 基于appcan平台开发一个简单的手机app--登录注册例子
  6. php+mysql实现简易博客系统
  7. 系统试运行报告是谁写的_家门口就能免费健康自检自测 延吉智慧健康驿站试运行 健康检测服务将惠及更多居民...
  8. Springboot毕设项目图书馆座位预定系统plo6rjava+VUE+Mybatis+Maven+Mysql+sprnig)
  9. hdu-6638 Snowy Smile
  10. ArrayList源码深度解析以及快速失败和安全失败机制详解【一万字】