首页 > 其他分享 >Vue学习笔记:Vuex Part04 Getter

Vue学习笔记:Vuex Part04 Getter

时间:2023-08-18 10:05:27浏览次数:43  
标签:Vue const Part04 state Getter import type id store

Getter可以将store的state派生出一些状态,比如根据条件进行过滤

Getter 接受 state 作为其第一个参数,示例:

const store = createStore({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos (state) {
      return state.todos.filter(todo => todo.done)
    }
  }
})

通过属性访问

Getter 会暴露为 store.getters 对象,可以以属性的形式访问这些值

store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]

Getter 也可以接受其他 getter 作为第二个参数:

getters: {
  // ...
  doneTodosCount (state, getters) {
    return getters.doneTodos.length
  }
}


通过方法访问

也可以通过让 getter 返回一个函数,来实现给 getter 传参。

getters: {
  // ...
  getTodoById: (state) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}

示例

在上文中deptList的值为,可以通过type来进行过滤。

{"id": 1, "name": "mainten", "type": 'support'},
        {"id": 2, "name": "hr", "type": 'support'},
        {"id": 3, "name": "T1", "type": 'dev'},
        {"id": 4, "name": "T2", "type": 'dev'},
        {"id": 5, "name": "T3", "type": 'dev'},
        {"id": 6, "name": "T4", "type": 'dev'}

store/index.js

// 1页面有多个需要共享的状态,引入vuex,便于维护(非父子通信)
// 2缓存部分异步数据,减少后端服务的访问,增加体验

import { createStore } from 'vuex'
import axios from 'axios'
import { ssrContextKey } from 'vue'

const store = createStore({
    state() {
        return {
            count: 0,
            datadept: []
        }
    },
    mutations: {
        increment(state) {
            state.count++
        },
        setcount(state, payload) {
            state.count = payload
        },
        setdatadept(state, payload) {
            state.datadept = payload
        }
    },
    actions: {
        async getDataDept(context) {
            if (context.state.datadept.length === 0) {
                console.log("length is 000")
                const res = await axios.get('http://127.0.0.1:5000/api/test/jsontest/Depts')
                console.log(res.data.msg)
                context.commit("setdatadept", res.data.msg)
            }

        }
    },
    getters: {
        filterDept: (state) => (deptype) => {
            return state.datadept.filter(item => item.type === deptype)
        }
    }
}
)
export default store

在这里先不使用getter方法

deptList 使用computed实现相同的功能

<template>
    <ul>
        <select v-model="type">
            <option value="support">support</option>
            <option value="dev">dev</option>
        </select>
        <li v-for="d in data" :key="d.id" @click="routeClick(d.id)">{{ d.name }}</li>
    </ul>
</template>
<script setup>
import { computed, onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex'

const type = ref('support')
const store = useStore()
const router = useRouter()

const routeClick = (userid) => {
    router.push('detail/' + userid)
}

const  data=computed(()=>{
    return store.state.datadept.filter(d => d.type === type.value)
})
onMounted(
    () => {
        store.dispatch('getDataDept')
    }
)
</script>

使用getter实现

需要创建 computed 引用以保留响应性,这与在选项式 API 中创建计算属性等效。

<template>
    <ul>
        <select v-model="type">
            <option value="support">support</option>
            <option value="dev">dev</option>
        </select>
        <li v-for="d in data" :key="d.id" @click="routeClick(d.id)">{{ d.name }}</li>
    </ul>
</template>
<script setup>
import { computed, onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex'

const type = ref('support')
const store = useStore()
const router = useRouter()

const routeClick = (userid) => {
    router.push('detail/' + userid)
}

// const  data=computed(()=>{
//     return store.state.datadept.filter(d => d.type === type.value)
// })
const data = computed(()=>store.getters.filterDept(type.value))
onMounted(
    () => {
        store.dispatch('getDataDept')
    }
)
</script>

Vue学习笔记:Vuex Part04 Getter_vuex

标签:Vue,const,Part04,state,Getter,import,type,id,store
From: https://blog.51cto.com/quietguoguo/7131893

相关文章

  • 安装VS Code并配置Vue开发环境
    VSCode是一款轻量级、功能强大的代码编辑器,支持多种编程语言和平台。它不仅提供了基本的文本编辑功能,还集成了终端、调试器、版本控制等工具,使得开发工作更加高效。以下是安装VSCode的步骤:在浏览器中打开VSCode官方网站(https://code.visualstudio.com/),点击下载适合自己操作系统......
  • MTvue
    标签a-space标签:这是一个AntDesign的a-space组件,用于在内部放置一些元素,并根据需要添加间距。AntDesign:是一个基于React的企业级UI组件库,提供了丰富的可复用的UI组件和样式。a-button标签<a-buttontype="primary"@click="handleAdd">新增</a-button>这是一个Ant......
  • Vue的数据更新,页面不更新的解决办法
    可能原因更新的数据跟源数据不是同一个,即不是同一个引用解决办法最稳妥的办法,可通过拿到源数据取索引的方式进行数据的更新,如:有一个源数据叫:originData那么如果在更新时,通过this.originData[index].time=newValue的方式进行更新,而不是item.time=newValue这样,更新的是源......
  • vue2使用vite
    安装插件//一个vite必备,第二个是为了兼容vue2npmi-Dvitevite-plugin-vue2将public中的index.html拉出来,放在最外层,与package.json同级在index.html中引入main.js<!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><metahttp-e......
  • vue3 vue.config.js配置详解
    //vue.config.js文件是用于VueCLI项目的全局配置的module.exports={  //部署应用包时的公共路径  publicPath:"./",  //生产环境构建文件的目录名(默认为dist)  outputDir:"dist",  //放置生成的静态资源的目录(默认为dist/static),可以修改为public。  assetsDir......
  • vue面试2
    VUE21.为什么.Vue被称为“渐进框架”?使用渐进式框架的代价很小,从而使现有项目(使用其他技术构建的项目)更容易采用并迁移到新框架。Vue.js是一个渐进式框架,因为你可以逐步将其引入现有应用,而不必从头开始重写整个程序。Vue的最基本和核心的部分涉及“视图”层,因此可以通......
  • vue3 文件上传进度条组件
    index.vue文件<template><divclass="confirm-modal"><transitionname="fade"><divclass="modal-dialog"@click="clickMaskToClose?handleCancel():null"v-if="visible"@tou......
  • vue面试题1
    VUE11.那你能讲一讲MVVM吗?MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到页面中,视图变化的时候会通知viewModel层更新数据。2.简单......
  • vue中引入echarts
    1、先下载依赖包npminstallecharts-s//安装在目标项目中,如果想要全局安装就用-g2、引入2.1、全局引入main.js中importechartsfrom'echarts'Vue.prototype.$echarts=echarts//也可以用:import*asechartsfrom'echarts'2.2、局部引入component.vueimportechar......
  • vue2第一章
    1.安装两个vscode插件vetur--让.vue文件高亮和有语法提示VueVsCodesnippets--快捷写代码2.vue组件一个.vue文件就是一个组件,称为单文件组件<template><div>//这里写HTML注意:template只能有一个根节点</div></template><script>//导出一......