dva.js 用法詳解:列表展示

来源:https://www.cnblogs.com/axel10/archive/2018/03/12/8548305.html
-Advertisement-
Play Games

本教程案例github:https://github.com/axel10/dva_demo-Counter-and-list/tree/master 這次主要通過線上獲取用戶數據並且渲染成列表這個案例來演示dva.js。 整個開發流程概括下來應該是: 編寫用戶列表model(數據模型)-> 編寫修 ...


本教程案例github:https://github.com/axel10/dva_demo-Counter-and-list/tree/master

 

這次主要通過線上獲取用戶數據並且渲染成列表這個案例來演示dva.js。

整個開發流程概括下來應該是:

編寫用戶列表model(數據模型)->  編寫修改model的方法 -> 編寫服務介面 ->  編寫組件 ->  將組件與dva.js連接 -> 將dva.js提供的介面(dispatch)和數據模型通過props傳入組件 -> 渲染。

我們先從第一步開始。

編寫用戶列表model及修改方法:(src/models/users.js)

import * as userService from '../services/userService'

export default {
  namespace: "users",
  state: {
    list:[]
  },
  reducers: {        //用來修改數據模型的state。
    save(state, {payload:{data}}) {   //涉及到es6的拆包寫法。
      state.list = data;
      return {...state}
    },
    removeItem(state, {item}) {
      state.list = state.list.filter(function (lItem) {
        return item.id !== lItem.id
      });
      return{...state}
    }
  },

  effects: {           //effects指的是涉及到非同步請求的方法。通常用來調用服務獲取數據。這裡要註意如果effects的方法名與reducers中存在重覆的話容易造成死迴圈。
    * fetch(payload,{put, call}) {
      const data = yield call(userService.fatchData);
      yield put({type: "save", payload: data})
    },

    * fetchRemoveItem({item},{put,call}){
      const result = yield call(userService.fetchRemoveItem,item.id);
      if (result){
        console.log(true);
        yield put({type:"removeItem",item})
      }else{
        console.log(false);
      }
    }

  },

  subscriptions: {              //觸發器。setup表示初始化即調用。其他用法見官方文檔。https://github.com/sorrycc/blog/issues/62
    setup({dispatch}) {
      dispatch({type: 'fetch'})
    }
  }

}

編寫完畢後不要忘了在src/index.js中註冊數據模型:

app.model(require('./models/users').default);

 

編寫服務介面:(src/services/userService.js)

import request from "../utils/request";


export function fatchData() {
  return request("/api/users")  
}

export function fetchRemoveItem(query) {
  console.log(query);
  return true
}

這裡涉及到mock數據。方法為修改根目錄下的.webpackrc文件:

{
  "proxy": {
    "/api": {
      "target": "http://jsonplaceholder.typicode.com/",
      "changeOrigin": true,
      "pathRewrite": {
        "^/api": ""
      }
    }
  }
}

接下來編寫組件:

先從路由組件開始:

import {connect} from 'dva'
import ListBody from "../components/ListBody"
import React from "react";

class List extends React.Component {
  render() {
    return (
      <ListBody {...this.props} />      //將自身的props傳給子組件。連接之後的組件可以擁有dispatch、索引後的數據模型。
    )
  }
}

function mapStateToProps(state) {      //將數據模型索引到props。
  return {users:state.users}
}

export default connect(mapStateToProps)(List)         //將組件與數據模型相連接。

這裡要重點說明:dispatch就是在connect的時候傳入的,用來做組件與數據模型之間的交互。

之後是ListBody組件:

import React from 'react';
import {Link} from 'dva/router'

class ListBody extends React.Component{

  removeUserItem(item){
    this.props.dispatch({type:"users/fetchRemoveItem",item})  //通過props獲取dispatch方法,users表示數據模型(namespace),fetchRemoveItem表示reducers或者effects。
  }

  render(){
    const that = this;
    let userList = [];
    let userData = this.props.users.list;   //users:數據模型,list:數據模型中的state

  if (userData.length>=1){ userData.forEach(function (item, index) { userList.push(<li key={index} onClick={that.removeUserItem.bind(that,item)}>{item.name}</li>) }) }return( <div> <h2>請嘗試點擊條目。</h2> {userList} </div> ) } } export default ListBody;

 

 

完畢後添加路由。

import React from 'react';
import { Router, Route, Switch,Redirect  } from 'dva/router';
import list from './routes/list'

function RouterConfig({ history }) {
  return (
    <Router history={history}>
      <Switch>
        <Route path="/list" exact component={list} />
        <Redirect to="/list"/>
      </Switch>
    </Router>
  );
}

export default RouterConfig;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用原生js製作的簡易留言板。 具備以下功能:1、在輸入框輸入文字留言;2、將留言顯示在留言板;3、刪除留言。 html和css代碼: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <style> 6 ...
  • 今天用node寫後臺,登錄認證使用了token,然後就使用了簡單的jwt simple,但是發現設置的過期時間不對,一直沒有提示過期,但是明明是已經過期了的時間,於是檢查了下jwt simple的源代碼。 我的路徑,根目錄下\node_modules\jwt simple\lib\jwt.js jw ...
  • 很久沒寫過筆記一類的東西了,從剛開始的996持續半年,直到最近,剛好這幾天有空,順便總結一下開發小程式的一些心路歷程。 在這裡呢順便打個廣告,小程式名字叫“一拍即傳”。 最近半年多呢一直在開發小程式,其實小程式跟傳統的web開發是極其相似的,當然也有不少不同的點,接下來 進入正題: 一開始學習小程式 ...
  • 結論:設置溢出文字,不要直接在li標簽上設置,因為會有list-style-type的問題,還是包裹在span中,設置span省略號。 ...
  • 老師要求用web製作一個拼圖游戲。 發現的問題:點擊隨機生成拼圖的按鈕後,打亂的圖片會出現無法還原的情況。 發現過程:每次生成一個拼圖後會測試它怎麼拼回去,結果發現有時候拼不回去。 數學原理:如果兩個矩陣的逆序數的奇偶性相同,則其中一個矩陣通過若幹次變換以後必定能夠得到另一個矩陣。 問題原因:隨機生 ...
  • 記錄生活,每天一點點 原因: 博主工作上一需求,是檢查表單是否被修改。如果確定被修改了 才做某些操作。項目呢是一個有些年曆史的老項目了,基本上JQ在操作DOM,考慮到如果更換react或者angularjs 想想還是算了吧 換了事情更多了。就自己寫了一勉強能滿足當前業務需要的一小段JS。沒有什麼技術 ...
  • 1.JSON 與 JS 對象的關係 JSON 是 JS 對象的字元串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字元串。 如var obj = {a: 'Hello', b: 'World'}; //這是一個對象,註意鍵名也是可以使用引號包裹的 var json = '{"a": "He ...
  • 本篇文章將介頁面佈局中的自適應佈局,常見的自適應佈局有以下2種:左列固定右列自適應、左右兩列固定中間自適應。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...