Vuex入门

Vuex入门

一.Vuex简介

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个“前端数据库”(数据仓库),

让其在各个页面上实现数据的共享包括状态,并且可操作

​ Vuex分成五个部分:

1.State:单一状态树

2.Getters:状态获取

3.Mutations:触发同步事件

4.Actions:提交mutation,可以包含异步操作

5.Module:将vuex进行分模块

四个JS文件作用

在这里插入图片描述

官方图解:

在这里插入图片描述

二.Vuex安装

1.在项目目录cmd中输入下列代码

    npm install vuex -S
    npm i -S vuex@3.6.2

2.创建store模块,分别维护state/actions/mutations/getters/ index.js

3.在store/index.js文件中新建vuex的store实例,并注册上面引入的各大模块

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import getters from './getters'
import actions from './actions'
import mutations from './mutations'
Vue.use(Vuex)
const store = new Vuex.Store({
 	state,
 	getters,
 	actions,
 	mutations
 })

 export default store

4.在main.js中导入并使用store实例

 import store from './store'

new Vue({
el: '#app',
router,
store, //在main.js中导入store实例
components: {
App
},
template: '<App/>',
data: {
//自定义的事件总线对象,用于父子组件的通信
Bus: new Vue()
}
      })

三.Vuex读取与修改

在state.js中创建值

export default{
    name:'Rachel'
}

在页面中读取方式1:

this.$store.state.name

代码:

<template>
  <div>
    <h1>页面1==={{msg}}</h1>
    <p>State直接取值</p>
<button @click="ff1">State直接取值</button>
  </div>
</template>

<script>
export default {
  name: 'Page1',
  data () {
    return {
      msg: 'Page1'
    }
  },
  methods:{
    ff1(){
     this.msg= this.$store.state.name;
    }
  }
}
</script>

<style>
</style>

效果:

在这里插入图片描述

在页面中读取方式2:

在getters.js中定义方法

export default{
      getName:function(state){
        return state.name;
      }
}

在vue文件中使用

ff2(){
     this.msg= this.$store.getters.getName;
    }

效果如上

改变Vuex中的值

在mutations.js中创建方法

export default{
   setName:function(state,payload){
     //载荷
     state.name=payload.name;
   }
}

在vue文件中使用 this.$store.commit(‘setName’,{name:‘Anone’});

ff3(){
     this.$store.commit('setName',{name:'Anone'});
      this.msg= this.$store.getters.getName;
    }

在页面2中显示state.js中name的值,在页面1中改变值后,页面2的值也改变,如图:

在这里插入图片描述

异步修改值方法

在actions.js中定义方法

export default{
  setNameAsync:function(context,payload){
     //context指的是vuex的实例
     //等价于this.$store
   setTimeout(function(){
      context.commit('stename',payload)
   },6000);//6秒后调用该事件
   }
}

Vue文件调用

  ff4() {
        this.$store.dispatch('setNameAsync', {
          name: 'Anone-ProPro'
        });
        this.msg = this.$store.getters.getName;
      }

此时将msg的值放入 computed中更容易显示出效果

 computed: {
      msg() {
        return this.$store.state.name;
      }
    }

效果:该事件可以和其他的事件一起进行

在这里插入图片描述

四.actions中发送Ajax获取后台数据

在actions中创建方法:

setNameAjax: function(context, payload) {
    let _this=payload._this;//获取vue实例
    let url=_this.axios.urls.VUEX_INFO;
    let params={
      resturantName:'HouTai'
    }
    _this.axios.get(url,{params:params}).then(resp=>{//发送Ajax请求
      if(resp.data.success){//如果成功接受到后台数据则更改name内容
        context.commit('setName',{
          name:resp.data.msg
        });
      }
    }).catch(err=>{

    })
  }

在Vue文件中将Vue实例传到上面的方法中

ff5() {
        this.$store.dispatch('setNameAjax', {
          _this:this
        })
      }

后台接口

package com.ssm.controller;

import com.ssm.util.JsonResponseBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;

@RestController
@RequestMapping("/vuex")
public class VuexController {

    @RequestMapping("/queryVuex")
    public JsonResponseBody<?> queryVuex(HttpServletRequest request) {
        String resturantName = request.getParameter("resturantName");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date());
        try {
            System.out.println("模拟异步情况,睡眠6秒,不能超过10秒,axios超时时间设置的是10秒!");
            Thread.sleep(6000);
            System.out.println("睡醒了,继续...");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new JsonResponseBody<>(resturantName + "-" + date,true,0,null);
    }
}

axios中超时时间默认是六秒,所以异步事件不能超过十秒

/**
 * vue项目对axios的全局配置
 */
import axios from 'axios'
import qs from 'qs'

//引入action模块,并添加至axios的类属性urls上
import action from '@/api/action'
axios.urls = action

// axios默认配置
axios.defaults.timeout = 10000; // 超时时间
// axios.defaults.baseURL = 'http://localhost:8080/j2ee15'; // 默认地址
axios.defaults.baseURL = action.SERVER;

//整理数据
// 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据
axios.defaults.transformRequest = function(data) {
	data = qs.stringify(data);
	return data;
};
export default axios;

最终效果:
在这里插入图片描述

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值