Vuex 教程案例:計數器以及列表展示

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

本案例github:https://github.com/axel10/Vuex_demo-Counter-and-list 本篇教程將以計數器及列表展示兩個例子來講解Vuex的簡單用法。 從安裝到啟動初始頁面的過程都直接跳過。註意安裝時選擇需要路由。 首先,src目錄下新建store目錄及相應文件 ...


 本案例github:https://github.com/axel10/Vuex_demo-Counter-and-list

本篇教程將以計數器及列表展示兩個例子來講解Vuex的簡單用法。

從安裝到啟動初始頁面的過程都直接跳過。註意安裝時選擇需要路由。

首先,src目錄下新建store目錄及相應文件,結構如下:

index.js文件內容:

import Vue from "vue"
import Vuex from 'vuex'

Vue.use(Vuex);    //務必在new Vuex.Store之前use一下

export default new Vuex.Store({
  state:{
    count:0       //計數器的count
  },
  mutations:{
    increment(state){
      state.count++
    }
  }
})

src下的main.js里註冊store

new Vue({
  el: '#app',
  router,
  store,        //註冊store
  components: { App },
  template: '<App/>'
});

 

components文件夾內新建Num.vue組件,內容如下

<template>
  <div>
    <input type="button" value="+" @click="incr" />
    <input type="text" id="input" v-model="count"/>
    <input type="button" value="-"/>
    <br/>
    <router-link to="/list">列表demo</router-link>
  </div>
</template>

<script>
  import store from '../store'
  export default {

    computed:{
      count:{
        get:function () {
          return store.state.count
        },
        set:function (val) {
          store.state.count = val
        }
      }
    },

    methods:{
      incr(){
        // store.commit("increment")
        store.commit("increment")    //觸發修改
      }
    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

router文件夾內配置路由:

import Vue from 'vue'
import Router from 'vue-router'
import Num from '../components/Num'
import List from  '../components/List'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path:'/num',
      component:Num
    },

    {
      path:"*",
      redirect:"/num"
    }
  ]
})

完成後啟動,即可看到結果。計數器演示完成。

現在開始列表演示。

 

src目錄下新建api文件夾,再新建api文件。

api/cover.js:

const _cover = [
  {"id": 1, "title": "iPad 4 Mini", "price": 500.01, "inventory": 2},
  {"id": 2, "title": "H&M T-Shirt White", "price": 10.99, "inventory": 10},
  {"id": 3, "title": "Charli XCX - Sucker CD", "price": 19.99, "inventory": 5}
];


export default {
  getCover(cb) {
    setTimeout(() => cb(_cover), 100);
/*    $.get("/api/data",function (data) {
      console.log(data);
    })*/

  },
}

修改store/modules/cover.js:(定義數據模型。數據模型包含了數據以及對該數據的修改操作。)

import cover from '../../api/cover'

const state = {
  all:[]
};

const getters={
  allCover:state=>state.all   //getter用來提供訪問介面
};

const actions = {
  getAllCover({commit}){
    cover.getCover(covers=>{
      commit('setCover',covers)       //觸發setCover修改。
    })
  },
  removeCover({commit},cover){
    commit('removeCover',cover)
  }
};

const mutations = {   //mutations用來修改state。
  setCover(state,covers){
    state.all = covers
  },
  removeCover(state,cover){
    console.log(cover.id);
    state.all = state.all.filter(function (OCover) {
      return OCover.id !== cover.id
    })
  }
};

export default {
  state,getters,actions,mutations
}

store內的index.js中註冊數據模型:

import Vue from "vue"
import Vuex from 'vuex'
import cover from './modules/cover'

Vue.use(Vuex);    //務必在new Vuex.Store之前use一下

export default new Vuex.Store({

  modules:{
    cover         //註冊cover數據模型
  },

  state:{
    count:0       //計數器的count
  },
  mutations:{
    increment(state){
      state.count++
    }
  }
})

components文件夾內新建List.vue組件,內容如下:

<template>
  <div class="list">
    <ul>
      <li v-for="cover in covers" @click="removeCover(cover)">
        {{cover.title}}
      </li>
    </ul>
    <p>
      {{covers}}
    </p>
    <h2>請嘗試點擊li。</h2>
    <router-link to="/num">計數器demo</router-link>

  </div>
</template>

<script>
import {mapGetters,mapActions} from 'vuex';

export default {
  computed:mapGetters({
    covers:"allCover"      //利用module的getter獲得數據
  }),

  methods:mapActions([
    'removeCover'       //利用module的action刪除數據
  ]),

  created(){
    this.$store.dispatch('getAllCover')    //調用cover數據模型的getAllCover action 用來初始化列表數據。
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  .list{
    text-align: left;
  }
</style>

路由中註冊新組件:

import Vue from 'vue'
import Router from 'vue-router'
import Num from '../components/Num'
import List from  '../components/List'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path:'/num',
      component:Num
    },
    {
      path:'/list',
      component:List
    },
    {
      path:"*",
      redirect:"/num"
    }
  ]
})

完成後訪問http://localhost:8080/#/list,即可看到結果。

 


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

-Advertisement-
Play Games
更多相關文章
  • 總結一下目前在用的前端代碼規範,可作為開發參考 一、基礎規範 開發規範 項目目錄和文件的命名使用小寫字母,避免使用大寫或駝峰,多個單詞以下劃線 _ 分隔 如:my_project/cast_detail.js 目錄有複數意義的時候,使用複數命名 如 scripts images 某些第三方插件可直接 ...
  • 一、簡介 瀏覽器全屏有兩種方式,一種是HTML5新增的requestFullscreen全屏,另一種是摁F11實現的全屏,本文將詳解兩種全屏的特點以及其實現。 二、requestFullscreen全屏 1、判斷是否支持全屏 通過判斷元素的requestFullscreen函數是否存在與docume ...
  • [1]基本用法 [2]組件樣式 [3]擴展樣式 [4]更換標簽 [5]傳遞屬性 [6]attrs函數 [7]動畫 [8]添加類名 ...
  • 一、jQuery實現輪播圖 效果如下: 首先是HTML部分,代碼如下: JS代碼分析: 二、vue實現輪播圖 效果如下: vue輪播圖的基本原理相對簡單,即通過v-show="index currentIndex"來實現圖片的顯示,通過改變currentIndex的值來切換圖片 ...
  • ## 0. 前言 比較基礎的圖標載入:<img src="x.png">和塊元素的背景background: url(./x.png). 頁面多圖標時,使用雪碧圖(多個png壓縮成一個png,定位來使用),減少圖片所占空間。 大屏顯示,為保證圖標清晰度,可以使用svg格式的圖片。svg是矢量圖,直接 ...
  • 前面的話 css modules是一種流行的模塊化和組合CSS的系統。 vue-loader提供了與css modules的集成,作為scope CSS的替代方案。本文將詳細介紹css modules 引入 最開始使用Vue的時候,提倡並大量使用的是scoped這種技術 這個可選 scoped 屬性 ...
  • 今天勉強看完視頻了,雖然白天都好像是在看視頻,可是看的都不快,學習的方法錯了果然是要出問題的,應該先看視頻,然後看代碼,再然後自己實現一遍的。 講到了路由和引用註入、還包括代碼拆分的思想什麼的。 換了個老師講課,現在的這個老師講課比較抽象,總是用些奇奇怪怪的例子,聽起來還不太好理解,有些遺憾當時沒跟 ...
  • 什麼是閉包?? 有權訪問另一個函數作用域內變數的函數就是閉包。 看一個例子: 在這裡,控制台兩次輸出不一樣???為什麼??變數n不是重新賦值了嗎?? 並沒有,在這裡,var c = a(); 這段代碼意思是將 a 方法的返回值賦值給變數 c ,那麼 a() 的返回值就是 inc ,也就 functi ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...