dva


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=()=>{
       // 觸發effects
       this.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("變了")
          }
      }
   
  },

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM