轻松get到vuex

Vuex是干什么的? vuex是处理数据交互的,父子组件用的是props和emit,但是处理大数据页面的时候就需要用vuex, 可以做到一个数据变,其他引用这个数据的都变。

Vuex官方文档:https://vuex.vuejs.org/zh/guide/

vuex详细教程视频: https://ke.qq.com/course/481750?taid=5008215335459286
该视频教程从0-1学会vuex,比之前听的这个讲的比较清晰;

Vuex的4个属性:state、getters、actions、mutation、
state:设置数据
getters:获取数据
actions:异步数据操作
mutations:对数据进行处理的唯一途径。

vuex可以理解为本来一个C页面前套了A、B两个组件,A组件里面有一堆数据,B组件里面有一堆数据,A、B数据都来着于C页面。现在A数据变了想要B,C页面用到的数据也跟着变。传统方法是A数据去调用C页面,C页面再去调B页面。一两个组件可能工作量不是很多,若项目大,层级关系多,这样页面互相传值很容易会乱掉。vuex可以用state把初始数据作为一个数据源仓库,如果大家想要用的话,就从里面进行获取getters,如果想改变数据就可以用到里面的mutations进行操作,对于一些异步操作类似定时器这类的方法时就要用到actions;

如何使用vuex?
1.安装vuex
$ npm install vuex --save
2.在main.js同级目录下创建一个store.js文件

import Vue from ‘vue’
import Vuex from ‘vuex’
这两个vue、vuex一定要小写,不可大写,不然在引用页面console.log(this.$store)显示undefined

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

Vue.use(Vuex)
export const store  = new Vuex.Store({
    strict:true,
    state:{
        product:[{
            name: 'Num1',
            value:100
        },{
            name: 'Num2',
            value:200
        },{
            name: 'Num3',
            value:300
        },{
            name: 'Num4',
            value:400
        }]
    },
    getters:{
        saleProducts:(state)=>{

            var saleProducts = state.product.map(product=>{
                return {
                    name:"**"+product.name+"**",
                    value: product.value /2
                }
            })
            return saleProducts;
        }
    },
    mutations:{
        reduceProducts:(state,payload)=>{
            var reduceProducts = state.product.map(product=>{
                   product.value -=payload;
            })
            return reduceProducts;
        }
    },
    actions:{
        reduceProducts:(context,payload)=>{
            setTimeout(()=>{
                context.commit("reduceProducts",payload)
            },300)
            
        }
    }
})

在main.js进行全局引入store.js

import Vue from 'vue'
import App from './App'
import {store} from './store.js'

Vue.config.productionTip = false;
/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  components: { App },
 template: '<App/>',
 //  render: h => h(App)

})

在view文件夹中创建一个父组件index.vue

<template>
    <div class="parent">
        <div>VUEX-DEMO</div>
        <page1></page1>
        <page2></page2>
    </div>
</template>

<script>
    import page1 from './page1.vue'
    import page2 from './page2.vue'
    export default {
        components: {
            page1,
            page2
        },
        data() {
            return {
              
            }
        }
    
    }
</script>

<style lang="scss" scoped>
  .parent{
      margin-top:100px;
      margin-left: 20px;

  }
</style>

再创建一个page1.vue

<template>
<div class="page1">

      <li v-for="(item,index) in product" :key="index">
        <span>{{item.name}}</span>
       <span>{{item.value}}</span>
   </li>
</div>
</template>

<script>
export default {
    data() {
        return {

        }
    },
    computed:{
        product(){
            return this.$store.state.product;
        }
    }

}
</script>

<style lang="scss" scoped>
.page1 {
    width: 375px;
    background: #cc0;
    padding: 20px 0;
    color:#fff;
    font-weight: bold;
    display: flex;
    justify-content: space-around;
    align-content: center;

   li{
     
   }
}
</style>

再创建一个page2.vue

<template>
<div class="page2">
<button @click="reduceProducts(4)">降价</button>
    <li v-for="(item,index) in saleProducts" :key="index">
        <span>{{item.name}}</span>
       <span>{{item.value}}</span>
   </li>
</div>
</template>

<script>
import {mapGetters} from 'vuex'
import {mapActions} from 'vuex'
export default {
    data() {
        return {

        }
    },
    computed:{
      /*   saleProducts(){
           return this.$store.getters.saleProducts;
        } */
        ...mapGetters([
            "saleProducts"
        ])
    },
    methods:{
       /*  reduceProduct(amout){
            /* this.$store.state.product.forEach(product=>{
                   product.value -=1;
            }) */
            // mutaion
         // return this.$store.commit("reduceProducts",amout);
         //actions
        /* return this.$store.dispatch("reduceProducts",amout);
        } */
         ...mapActions([
      "reduceProducts"
    ])
    }

}
</script>

<style lang="scss" scoped>
.page2 {
      width: 375px;
    background: #324e4e;
    color:#fff;
    font-weight: bold;
    margin-top: 20px;
    li{

    padding: 20px;
    }
}
</style>

效果图
在这里插入图片描述

debugger调试技巧:
vue的页面都是经过渲染之后的页面,比较难找到对应的组件关系,还有使用vuex产生的数据关系;
安装vue.js工具
谷歌-》扩展工具-〉谷歌商店-》搜vue-〉点击安装vue.js.tool
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将项目接口数据全部存到Vuex中,可以按照以下步骤进行: 1. 首先,在Vuex中创建一个模块来存储接口数据。可以在store文件夹中的index.js中引入新建的模块。例如,创建一个名为apiData的模块,可以在index.js中写入以下代码: ``` import Vue from 'vue' import Vuex from 'vuex' import apiData from './modules/apiData' Vue.use(Vuex) export default new Vuex.Store({ modules: { apiData } }) ``` 2. 创建apiData模块,并在模块中定义state、mutations、actions和getters。可以在store文件夹中新建一个名为modules的文件夹,并在其中创建一个名为apiData.js的文件。 ``` // apiData.js const state = { data: [] } const mutations = { SET_DATA(state, payload) { state.data = payload } } const actions = { fetchData({ commit }) { // 调用接口获取数据并将数据通过commit方法传给mutations yourApi.fetchData().then(response => { commit('SET_DATA', response.data) }).catch(error => { console.log(error) }) } } const getters = { getData: state => state.data } export default { state, mutations, actions, getters } ``` 3. 在需要使用接口数据的组件中,可以通过mapGetters、mapActions等辅助函数从Vuex中获取数据和触发actions。例如,在一个名为DataList的组件中,可以这样使用: ``` <template> <div> <div v-for="item in apiData" :key="item.id"> {{ item.name }} </div> <button @click="fetchData">获取数据</button> </div> </template> <script> import { mapGetters, mapActions } from 'vuex' export default { computed: { ...mapGetters(['getData']) }, methods: { ...mapActions(['fetchData']) }, created() { this.fetchData() // 在组件创建时调用接口获取数据 } } </script> ``` 通过以上步骤,就可以将项目的接口数据全部存储到Vuex中,并在需要的组件中获取和使用这些数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值