Vue 同步异步存值取值实现案例


Posted in Javascript onAugust 05, 2020

1.vue中各个组件之间传值

1.父子组件

父组件?>子组件,通过子组件的自定义属性:props

子组件?>父组件,通过自定义事件:this.emit(′事件名′,参数1,参数2,...);

2.非父子组件或父子组件通过数据总数Bus,this.root.$emit(‘事件名',参数1,参数2,…)

3.非父子组件或父子组件

更好的方式是在vue中使用vuex

方法1: 用组件之间通讯。这样写很麻烦,并且写着写着,估计自己都不知道这是啥了,很容易写晕。

方法2: 我们定义全局变量。模块a的数据赋值给全局变量x。然后模块b获取x。这样我们就很容易获取到数据

2. Vuex

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

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

Vuex分成五个部分:

1.State:单一状态树

2.Getters:状态获取

3.Mutations:触发同步事件

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

5.Module:将vuex进行分模块

3. vuex使用步骤

3.1 安装

打开项目根目录,shift+鼠标右键进入窗口,输入以下命令

npm install vuex -S

3.2 在src目录下面创建store模块,分别维护state/actions/mutations/getters

Vue 同步异步存值取值实现案例

1.State:单一状态树

2.Getters:状态获取

3.Mutations:触发同步事件

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

5.Module:将vuex进行分模块

5、在store里面的index.js文件,并在文件中导入各大模块

index.js

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, // 共同维护的一个状态,state里面可以是很多个全局状态
 getters, // 获取数据并渲染
 actions, // 数据的异步操作
 mutations // 处理数据的唯一途径,state的改变或赋值只能在这里
})

export default store ///导出

6. Vuex的核心概念

store:每一个Vuex应用的核心就是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

state:我们用来存放我们需要用到的变量

gettters:用来获取我们定义的变量

mutations:操作我们定义的变量,同步操作

actions:操作我们定义的变量,异步操作

state.js

export default {
 // 凡是工程里的变量都定义到这里来,同时可以分类管理
 resturantName: '飞鸽传书'

}

gettters.js

export default{
    getResturantName: (state) => {
     return state.resturantName;

    }
}

mutations.js

export default {
 setResturantName: (state, payload) => {
 state.resturantName = payload.resturantName;
 return this.$store.state.resturantName;
 }
}

actions.js

export default{
 setResturantNameAsyc: (context, payload) => {
 console.log('xxx')
 setTimeout(()=>{
  console.log('yyy')
  context.commit('setResturantName', payload); //Action提交的是mutation
 },3000);
 console.log('zzz')
 },
 doAjax:(context, payload) => {
 // 在vuex里面不能使用vue实例
 let _this = payload._this;
 let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
 // let url = 'http://localhost:8080/T216_SSH/vue/userAction_login.action';
 console.log(url);
 _this.axios.get(url, {}).then((response) => {
  console.log('doAjax.........')
  console.log(response);
 }).catch(respone)=>{
  console.log(response);
 } 
 }
}

将store在main.js中导入并挂载Vue 中实例

vuex综合案例

需求:两个组件A和B,vuex维护的公共数据是餐馆名:resturantName,默认值:飞歌餐馆,

那么现在A和B页面显示的就是飞歌餐馆。如果A修改餐馆名称为A餐馆,则B页面显示的将会是A餐馆,反之B修改同理。

这就是vuex维护公共状态或数据的魅力,在一个地方修改了数据,在这个项目的其他页面都会变成这个数据。

VuePage1.vue

<template>
 <div>
 <h3 style="margin: 60px;">第一个Vuex页面{{title}}</h3>
 <button @click="changTitle">餐馆易主</button>
 <button @click="changTitleAsync">两个月后餐馆易主</button>
 <button @click="changTitleAsync">测试Vuex中使用ajax</button>
 </div>
</template>

<script>
 export default {
 data() {
  return {
  
  };
 },
    
 methods: {
  changTitle() {
  this.$store.commit('setResturantName', {
  });
  },
  changTitleAsync() {
  this.$store.dispatch('setResturantNameAsync', {
   resturantName: '小李飞刀羊肉馆'
  });
  },
  doAjax(){
  this.$store.dispatch('doAjax',{
   _this:this
  })
  }
 },
 computed: {
  title() {
  return this.$store.getters.getResturantName;
  }
 },
 created(){
  this.title=this.$store.state.resturantName;
 } 
 }
</script>

<style>
</style>

VuePage2.vue

<template>
 <div>
 <h3 style="margin: 60px;">第二个Vuex页面{{title}}</h3>
 this.$store.commit(type,payload); 
 </div> 
</template>

<script>
 export default{
 data(){
  return{
  
  };
 },
 created(){
  this.title=this.$store.state.resturantName;
 }
 }
</script>

<style>
</style>

Vue 同步异步存值取值实现案例

Action类似于 mutation,不同在于:

1.Action提交的是mutation,而不是直接变更状态

2.Action可以包含任意异步操作

3.Action的回调函数接收一个 context 上下文参数,注意,这个参数可不一般,它与 store 实例有着相同的方法和属性

但是他们并不是同一个实例,context 包含:

1. state、2. rootState、3. getters、4. mutations、5. actions 五个属性

所以在这里可以使用 context.commit 来提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

注1:actions中方法的调用方式语法如下:

this.store.dispatch(type,payload);例如:this.store.dispatch(type,payload);例如:this.store.dispatch(‘setResturantNameByAsync',{resturantName: ‘啃德鸡2'});

注2:action中提交mutation

context.commit(‘setResturantName',{resturantName: ‘啃德鸡2'});

注3:VUEX 的 actions 中无法获取到 this 对象

如果要在actions 或者 mutations 中使用this对象。可以在调用的时候把this对象传过去

{resturantName: ‘啃德鸡2',_this:this}//this就是在调用时的vue实例

Vuex中actions的使用场景

场景1:部门管理中添加或删除了新的部门,员工新增/编辑页面的部门列表需要进行变化

场景2:vuex之使用actions和axios异步初始购物车数据

以上这篇Vue 同步异步存值取值实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS对URL字符串进行编码/解码分析
Oct 25 Javascript
JS鼠标事件大全 推荐收藏
Nov 01 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
基于Marquee.js插件实现的跑马灯效果示例
Jan 25 Javascript
JS验证字符串功能
Feb 22 Javascript
微信小程序--组件(swiper)详细介绍
Jun 13 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
Oct 19 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
Jul 10 Javascript
详解vue路由
Aug 05 #Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 #Javascript
vant 自定义 van-dropdown-item的用法
Aug 05 #Javascript
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 #Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
Aug 05 #Javascript
vue实现在进行增删改操作后刷新页面
Aug 05 #Javascript
vue 限制input只能输入正数的操作
Aug 05 #Javascript
You might like
Smarty Foreach 使用说明
2010/03/23 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
深入学习Python中的装饰器使用
2016/06/20 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
Django开发中的日志输出的方法
2018/07/02 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
计算机软件专业求职信
2014/06/10 职场文书
商家认证委托书格式
2014/10/16 职场文书
学前班教学反思
2016/02/24 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle