使用Vue.observable()进行状态管理的实例代码详解


Posted in Javascript onMay 26, 2019

随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。

先看下官网描述,如下图

 使用Vue.observable()进行状态管理的实例代码详解

observable()方法,用于设置监控属性,这样就可以监控viewModule中的属性值的变化,从而就可以动态的改变某个元素中的值,监控属性的类型不变量而是一个函数,通过返回一个函数给viewModule对象中的属性,从而来监控该属性。

说那么多,我们在实际例子中尝试玩一下:

搭建个简单脚手架,在项目src目录下建立store.js,在组件里使用提供的 store和 mutation方法,同理其它组件也可以这样使用,从而实现多个组件共享数据状态。

首先创建一个 store.js,包含一个 store和一个 mutations,分别用来指向数据和处理方法。

//store.js
import Vue from 'vue';

export let store =Vue.observable({count:0,name:'李四'});
export let mutations={
  setCount(count){
    store.count=count;
  },
  changeName(name){
    store.name=name;
  }
}

然后在组件Home.vue中引用,在组件里使用数据和方法:

//Home.vue
 <template> 
    <div class="container"> 
      <home-header></home-header> 
      <button @click="setCount(count+1)">+1</button>
      <button @click="setCount(count-1)">-1</button>
       <div>store中count:{{count}}</div>
      <button @click="changeName(name1)">父页面修改name</button>
      <div>store中name:{{name}}</div>
      <router-link to="/detail" ><h5>跳转到详情页</h5>  </router-link>
    </div> 
  </template> 
  <script> 
    import HomeHeader from '../components/HomeHeader'  
    import {store,mutations} from '@/store'
    export default { 
      data () { 
        return { 
          name1:'主页的name'
        } 
      }, 
      components: { 
        HomeHeader 
      }, 
      computed:{
        count(){
          return store.count
        },
        name(){
          return store.name
        }
      },
      methods:{
        setCount:mutations.setCount,
        changeName:mutations.changeName  
      }
    } 
  </script>

 使用Vue.observable()进行状态管理的实例代码详解

再定义一个子页面观察数据:

//Detail.vue
<template> 
  <div class="detail"> 
    <detail-header></detail-header> 
    <button @click="changeName(name2)">子页面修改name</button>
    <p>store中name:{{name}}</p>
  </div> 
</template> 
<script> 
  import DetailHeader from '../components/DetailHeader' 
  import {store,mutations} from '@/store'
  export default { 
    components: { 
      DetailHeader 
    } ,
    data(){
      return {
        name2:'子页的name'
      }
    },
    computed:{
      name(){
        return store.name
      }
    },
    methods:{
      changeName:mutations.changeName
    }
  } 
</script>

子页面显示如图:

使用Vue.observable()进行状态管理的实例代码详解 

我们简单点击下按钮,改变下store中的数据,效果如下:

使用Vue.observable()进行状态管理的实例代码详解 

最后补充一点,就是如果当前项目vue版本低于2.6,要使用Vue.observable(),就必须要升级,升级 vue 和 vue-template-compiler,两者的版本需要同步,如果不同步项目会报错。

//升级vue版本
npm update vue -S 或者 yarn add vue -S
npm update vue-template-compiler -D 或者 yarn add vue-template-compiler -D

总结

以上所述是小编给大家介绍的使用Vue.observable()进行状态管理的实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 Javascript
使用开源工具制作网页验证码的方法
Oct 17 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
Oct 17 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
详解JS中的立即执行函数
Feb 24 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
vue中rem的配置的方法示例
Aug 30 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
toString.call()通用的判断数据类型方法示例
Aug 28 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 #Javascript
vue项目打包后怎样优雅的解决跨域
May 26 #Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 #Javascript
vue实现的请求服务器端API接口示例
May 25 #Javascript
Vue Autocomplete 自动完成功能简单示例
May 25 #Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
May 24 #Javascript
了解JavaScript中的选择器
May 24 #Javascript
You might like
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
JSONP 跨域共享信息
2012/08/16 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
JS实现秒杀倒计时特效
2020/01/02 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python 逐行分割大txt文件的方法
2017/10/10 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python中subprocess批量执行linux命令
2018/04/27 Python
django 多数据库配置教程
2018/05/30 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
捐书寄语赠言
2014/01/18 职场文书
咖啡馆创业计划书
2014/01/26 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
公司财务部岗位职责
2015/04/14 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript