zoukankan      html  css  js  c++  java
  • Vue-admin工作整理(十): Vuex-Actions(模拟接口请求实现组件字段更新)

    思路:通过提交一个 mutation,而不是直接变更状态,它可以包括异步操作,通过请求接口,定义一个方法,第一个参数为对象,在里面能够提取到一些东西,比如:commit,这是一个方法,调用这个commit去提交一个mutation

        

    import { getAppName } from '@/api/app'
    
    const actions = {
      // 请求接口,修改appName字段数据,定义一个updateAppName方法,第一个参数为对象,在里面能够提取到一些东西,比如:commit,这是一个方法,
      // 调用这个commit去提交一个mutation,“{ commit }”写法为es6的方式,它相当于获取到的是一个params对象。
      // upadateAppName ({ commit }) {
      //   // es6的函数
      //   getAppName().then(res => { // 模拟一个异步请求,
      //     const { info: { appName } } = res // es6的写法
      //     commit('setAppName', appName)
      //   }).catch(err => {
      //     console.log(err)
      //   })
    
      async updateAppName ({ commit }) { // es8的回调函数
        console.log({ commit })
        try {
          const { info: { appName } } = await getAppName()
          commit('setAppName', appName)
        } catch (err) {
          console.log(err)
        }
      }
    }
    export default actions
    <template>
      <div>
        <a-input v-model="inputValue"/>
        <p>{{ inputValue }} -> lastLetter is {{ inputValueLastLetter }}</p>
        <p>appName: {{ appName }} -> appNameWithVersion is {{ appNameWithVersion }}</p>
        <p>userName: {{ userName }} -> firstLetter is {{ firstLetter }}</p>
        <a-show :message = "inputValue"/>
        <p><button @click="handleChangeAppName">修改appName</button></p>
        <p>{{ appVersion }}</p>
        <p><button @click="handleChangeUserName">修改用户名</button></p>
      </div>
    </template>
    <script>
    import AInput from '_c/AInput.vue'
    import AShow from '_c/AShow.vue'
    import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
    export default {
      name: 'store',
      data () {
        return {
          inputValue: ''
        }
      },
      components: {
        AInput,
        AShow
      },
      computed: {
        ...mapState({
          appName: state => state.appName,
          userName: state => state.user.userName,
          appVersion: state => state.appVersion
        }),
        ...mapGetters([
          'appNameWithVersion',
          'firstLetter'
        ]),
        inputValueLastLetter () {
          return this.inputValue.substr(-1, 1)
        }
      },
      methods: {
        ...mapActions([
          'updateAppName'
        ]),
        ...mapMutations([
          'setAppName',
          'setAppVersion',
          'setUserName'
        ]),
        handleChangeAppName () {
          // this.$store.commit('setAppName', {
          //   appName: 'newAppName'
          // })
          // this.$store.commit('setAppVersion')
          this.setAppName({
            appName: 'apache'
          })
          this.setAppVersion('V 2.0.2')
          // console.log(this.$store)
          // console.log(this.updateAppName)
          this.updateAppName()
        },
        handleChangeUserName () {
          this.setUserName({
            userName: 'alibaba'
          })
        }
      }
    }
    </script>

    总结:

      1、mapActions是一个方法,注意它的定义位置不能放在computed里,这样会重复调用,产生 is not faction的现象

      2、action有异步调用,注意增加时间等待的方法

  • 相关阅读:
    Java路径问题终于解决方式—可定位全部资源的相对路径寻址
    易学设计模式看书笔记(2)
    js算法:分治法-棋盘覆盖
    [NIO]dawn之Task具体解释
    C#高级编程五十八天----并行集合
    [Swift通天遁地]九、拔剑吧-(12)创建Preview-Transition图像预览界面
    [Swift通天遁地]九、拔剑吧-(11)创建强大的Pinterest风格的瀑布流界面
    [Swift通天遁地]九、拔剑吧-(10)快速创建美观的聊天界面:可发送文字、表情、图片
    [Swift通天遁地]九、拔剑吧-(9)创建支持缩放、移动、裁切的相机视图控制器
    [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果
  • 原文地址:https://www.cnblogs.com/cristin/p/9634489.html
Copyright © 2011-2022 走看看