Vue2.5開發去哪兒網App 城市列表開發之 Vuex實現數據共用及高級使用

来源:https://www.cnblogs.com/donghaoblogs/archive/2019/02/27/10447361.html
-Advertisement-
Play Games

一,數據共用 1. 安裝: 2. 在src目錄下 新建state文件夾,新建index.js文件 3. 創建一個 store 4.main.js中創建根實例時,傳入store 5.然後子組件使用: 二,數據的修改 1. 給每個城市綁定一個方法: 2. 在Index.js中: 效果: 3. 簡化步驟 ...


一,數據共用

1.  安裝:

npm install vuex --save

2. 在src目錄下 新建state文件夾,新建index.js文件

3. 創建一個 store

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

Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    city: '上海'
  }
})

4.main.js中創建根實例時,傳入store


import store from './store'
......
new Vue({ el: '#app', router, store, components: { App }, template: '
<App/>' })
......

5.然後子組件使用:

//獲取城市名
{{this.$store.state.city}}

二,數據的修改

 

1. 給每個城市綁定一個方法:

@click="HandleCity(城市名)"
HandleCity (value) {
// 派發一個citychange city的 action
this.$store.dispatch('citychanged',value)
}

2. 在Index.js中:

  actions: {
//ctx上下文 citychanged (ctx, cityname) { ctx.commit(
'citychanged', cityname) } }
mutations: {
//改變數據
citychanged (state, city) {
state.city = city
}
}

效果:

3. 簡化步驟

    HandleCity (value) {
      this.$store.commit('citychanged', value)
    }

index.js中 省略actions:

  mutations: {
    citychanged (state, city) {
      state.city = city
    }
  }

搜索Seatch組件步驟一致

三,使用localstorage存儲當前城市,並返回到城市

每次刷新後,城市預設

localStorage - 用於長久保存整個網站的數據,保存的數據沒有過期時間,直到手動去除。

let defaultCity = '北京'
try {
//判斷瀏覽器是否支持
if (localStorage.city) { defaultCity = localStorage.city } } catch (e) {}
//點擊後頁面跳轉
this.$router.push('/')

在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push

 

四,vuex高級使用

mapState:
import { mapState, mapMutations } from 'vuex'

mapState指將state數據映射到city的計算屬性中
computed: mapState({
    current_city: 'city'
})
// html寫法:
// {{this.current_city}}

 

mapMutations :

你可以在組件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 輔助函數將組件中的 methods 映射為 store.commit 調用
    HandleCity (value) {
      this.citychanged(value)
      this.$router.push('/')
    },
    ...mapMutations([
      'citychanged'
    ])

mapgetter函數:

mapGetters 輔助函數僅僅是將 store 中的 getter 映射到局部計算屬性:

import { mapGetters } from 'vuex'

export default {
  // ...
  computed: {
  // 使用對象展開運算符將 getter 混入 computed 對象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}
如果你想將一個 getter 屬性另取一個名字,使用對象形式:

mapGetters({
  // 把 `this.doneCount` 映射為 `this.$store.getters.doneTodosCount`
  doneCount: 'doneTodosCount'
})
<template>
  <div class="list" ref="wrapper">
    <div>
      <div class="area">
        <div class="title border-topbottom">當前城市</div>
        <div class="button-list">
          <div class="button-wrapper">
            <div class="button" ref="mycity">{{this.current_city}}</div>
          </div>
        </div>
      </div>
      <div class="area">
        <div class="title border-topbottom">熱門城市</div>
        <div class="button-list">
          <div class="button-wrapper"  v-for="city in hotcities" :key="city.id">
            <div class="button" @click="HandleCity(city.name)">{{city.name}}</div>
          </div>
        </div>
      </div>
      <div class="area" v-for="(city,key) in cities" :key="key" :ref="key">
        <div class="title border-topbottom">{{key}}</div>
        <div class="item-list">
          <div class="item border-bottom" v-for="c in city" :key="c.id" @click="HandleCity(c.name)">{{c.name}}</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import BScroll from 'better-scroll'
import { mapState, mapMutations } from 'vuex'
export default {
  name: 'CityList',
  mounted: function () {
    this.scroll = new BScroll(this.$refs.wrapper)
  },
  props: ['cities', 'hotcities', 'letter'],
  methods: {
    HandleCity (value) {
      // this.$store.commit('citychanged', value)
      this.citychanged(value)
      this.$router.push('/')
    },
    ...mapMutations([
      'citychanged'
    ])
  },
  watch: {
    letter () {
      if (this.letter) {
        const element = this.$refs[this.letter][0]
        this.scroll.scrollToElement(element)
      }
    }
  },
  computed: mapState({
    current_city: 'city'
  })
}
</script>
<style lang="stylus" scoped>
  @import "~styles/varibles.styl"
  .border-topbottom
    &:before
      border-color #ccc
    &:after
      border-color #ccc
  .border-bottom
  &:before
    border-color #ccc
  .list
    overflow hidden
    position absolute
    top 1.58rem
    right 0
    bottom 0
    left 0
    .title
      line-height .54rem
      padding-left .2rem
      background #eee
      color #666
      font-size .26rem
    .button-list
      padding .1rem .6rem .1rem .1rem
      overflow hidden
      .button-wrapper
        float left
        padding .1rem
        .button
          text-align center
          margin .1rem
          border .02rem solid #ccc
          border-radius .06rem
          padding .1rem .5rem
    .item-list
      .item
        line-height .76rem
        padding-left .2rem
</style>
List.vue
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'
Vue.use(Vuex)
export default new Vuex.Store({
  state: state,
  // 省略步驟
  // 1. this.$store.dispatch('citychanged', value)
  // 2. actions: {
  //   citychanged (ctx, cityname) {
  //     ctx.commit('citychanged', cityname)
  //   }
  // },
  mutations: mutations
})
/src/store/index.js

項目地址:

https://github.com/1417766861/Vue2.5-App


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

-Advertisement-
Play Games
更多相關文章
  • 【目錄】 (一)上傳圖片到伺服器一 Android代碼 (二)上傳圖片到伺服器二 Android 系統7.0以上調用相機相容問題 (三)上傳圖片到伺服器三 後臺伺服器代碼 一、相關知識 ①Android許可權申請 ②網路訪問框架OKHttp ③記憶體溢出問題:圖片壓縮 ④Android 系統7.0以上調 ...
  • 1). 在block內部使用外部指針且會造成迴圈引用情況下,需要用__week修飾外部指針: __weak typeof(self) weakSelf = self; 2). 在block內部如果調用了延時函數還使用弱指針會取不到該指針,因為已經被銷毀了,需要在block內部再將弱指針重新強引用一下 ...
  • 最近由於項目需要, 一直在研究藍牙4.0,在這兒分享給大家, 望共同進步. 一、關於藍牙開發的一些重要的理論概念: 1.當前ios中開發藍牙所運用的系統庫是<CoreBluetooth/CoreBluetooth.h>。 2.藍牙外設必須為4.0及以上(2.0需要MFI認證),否則無法開發,藍牙4. ...
  • 一、前言 LLDB是個開源的內置於XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安裝C++或者Python插件。在日常的開發和調試過程中給開發人員帶來了非常多的幫助。瞭解並熟練掌握LLDB的使用是非常有必要的。這篇文章將會帶著大家一起瞭解在iOS開 ...
  • Unity 4.7 導出工程在XCode9/10上報錯 validateRenderPassDescriptor:644: failed assertion `Texture at colorAttachment[0] has usage (0x01) which doesn't specify M... ...
  • BBWebImage 設計思路 BBWebImage 是 Swift 圖片組件,用於圖片下載、緩存、編解碼、編輯與展示。 GitHub 地址: "https://github.com/Silence GitHub/BBWebImage" 效果圖 下載、展示並緩存原圖 下載、漸進式解碼、編輯圖片,緩存 ...
  • 前置條件是所有用戶相關介面都走 https,非用戶相關列表類數據走 http。 步驟 第一次登陸 getUserInfo 裡帶有一個長效 token,該長效 token 用來判斷用戶是否登陸和換取短 token 把長效 token 保存到 SharedPreferences 介面請求用長效 toke ...
  • 最近寫了一個谷歌瀏覽器插件(Chrome extension),拿出來分享下,希望能提升大家的工作效率。 一、背景 先說痛點:日常開發中,經常需要不停的把介面輸出的JSON拷貝到線上JSON格式化頁面進行校驗、查看和對比等操作,但是現在主流的線上JSON格式化網站都只支持單個操作,如果想同時查看多條 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...