如何快速上手Vuex


Posted in Javascript onFebruary 14, 2017

在Mvc模式大行其道的今天,后端通过各种Mvc框架实现视图与数据模型的隔离,而前端这方面也发展迅速。vue实现了Dom与viewModel双向绑定,使其视图的更新影响模型,模型的更新影响视图,你会不会觉得这就是Mvc库呢,实则不然,因为他还差一个重要的C(也就是控制器)。以下是鄙人对Mvc的个人理解,如有失误还请各位道友指正。

  • M:模型用于表示各种事物及事物特性的数据
  • v:view + viewModel,此处鄙人认为v不能单纯的理解为视图,而应该是视图+视图模型。
  • c:控制器,用于协调M与v之间的关系。

第一部分:我对vuex的理解

这个重要的C是谁呢,鄙人认为就是此文章要介绍的Vuex。如此理解也是可以的:vue + vuex = 前端mvc框架

flux(单向数据流)

  • actions:一个动作,可以是view创建的,也可以是程序其他逻辑创建的
  • dispatcher:将业务逻辑与用户界面分离,负责响应action动作事件,并意向传遍整个系统
  • store:业务逻辑处理
  • view:视图

vuex是借鉴了flux、redux、The Elm Architecture等相关思想。

第二部分:揭开vuex面纱

本示例实现为一个输入框动态向下拉列表增加选择项的功能源码下载地址,先看效果图:

 如何快速上手Vuex

为了展示vuex的作用,此示例你可以看到如下内容:

  • 两个局部组件:输入和下拉列表组件
  • 一个全局组件:App,也是整个Vue实例的顶级组件
  • 一个jquery.js和bootstrap.js,用于实例下拉组件,jquery只辅助用于bootstrap。
  • 还有一个bootstrap.css,用于美化样式。

一、实现vuex的store实例

//Vue.use(Vuex);//如果是window引入方式,vuex会自动附加到Vue上。
var state = {
 list: [{"id":1, "name": "001"}]
};
var mutations = {
 ADDITEM: function(argState, item){
 argState.list.push(item);
 }
};
var getters = {
 getList:function(argState){
 return argState.list;
 }
}
var actions = {
 addItem:function(dis,item){
 dis.commit('ADDITEM',item);
 }
}
var _storeObj = new Vuex.Store({
 "state": state,
 "mutations": mutations,
 "getters": getters,
 "actions": actions
});

vuex更新数据流程:

 如何快速上手Vuex

  • dispatch可以是view视图中触发,也可以是程序业务逻辑来触发
  • actions通过commit方法发出一个改变事件
  • mutations中具体操作state的改变
  • state的改变通过getter暴露给view,state改变后会立即通知用getter关联起来的view。
  • 创建一个Vuex.Store的实例,用于Vue实例。

二、实现vue的组件

var inputComp = {
 render:function(createElement){
 var self = this; 
 return createElement('div',{
 attrs:{
 "data-id": "001"
 },
 class:{
 "form-inline":true
 },
 style:{
 "display": "inline-block"
 }
 },[createElement('input',{
 attrs:{
 type: 'text'
 },
 class:{
 "form-control": true
 },
 domProps:{
 value: self.value
 },
 on:{
 input:function(event){
  self.value = event.target.value;
 }
 } 
 }),createElement('button',{
 on:{
 "click": function(event){
  self.$store.dispatch('addItem',{"id":2,"name": self.value});
 }
 },
 class:{
 "btn":true,
 "btn-primary": true
 },
 domProps:{
 type: 'button'
 }
 },"添加")]);
 }
};
//下拉列表组件
var ComboComp = {
 render:function(createElement){ 
 var self = this;
 return createElement("div",{
 attrs:{
 "data-id": "ComboComp"
 },
 class:{
 "dropdown":true
 },
 style:{
 "display": "inline-block"
 }
 },[
 createElement("button",{
 class:{
  "btn": true,
  "btn-default": true,
  "dropdown-toggle": true
 },
 attrs:{
  "type": "button",
  "id": "dr02",
  "data-toggle": "dropdown"
 }
 },[ createElement("span", "选择"), createElement("span",{
 class:{
  "caret":true
 }
 })])
 ,
 createElement("ul",
 {
 class:{
  "dropdown-menu":true
 },
 attrs:{
  "aria-labelledby":"dr02"
 }
 }, self.$store.getters["getList"].map(function(item){
 return createElement("li",item.name);
 }))
 ])
 }
};
Vue.component('App',{
 template:'<div class="wrap" ><ComboComp></ComboComp> <InputComp></InputComp></div>',
 components:{
 "InputComp": inputComp,
 "ComboComp": ComboComp
 }
});

1.inputComp(局部组件):提供输入

2.ComboComp(局部组件):实现列表内容的展示

3.App(全局组件):顶级组件,组合inputComp和ComboComp组件。

4.组件参数说明:

render:返回一个组件,其中包含视图,data等。this为vue实例,参数是createElement方法,用于创建VNode。

5.重点关注inputComp组件中button子元素的on中的click方法,内部用dispatch触发了store中对应Id的actions

createElement('button',{
on:{
 "click": function(event){
 self.$store.dispatch('addItem',{"id":2,"name": self.value});
 }
}

三、输出

html部分代码:

<div class="wrap" id="app">
 <App></App>
</div>

js部分代码:

var _vue = new Vue({
 el: '#app',
 store: _storeObj
});
  • 视图中引入了App这个全局组件
  • 生成Vue实例的时候将vuex中创建的store实例传递进去。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
脚本之家贴图转换+转贴工具用到的js代码超级推荐
Apr 05 Javascript
jQuery中操控hidden、disable等无值属性的方法
Jan 06 Javascript
AngularJS 实现按需异步加载实例代码
Oct 18 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
微信小程序  modal弹框组件详解
Oct 27 Javascript
js 打开新页面在屏幕中间的实现方法
Nov 02 Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
基于node.js之调试器详解
Aug 22 Javascript
jquery+css实现下拉列表功能
Sep 03 jQuery
node中使用log4js4.x版本记录日志的方法
Aug 20 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
Feb 14 #Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
Feb 14 #Javascript
Vue组件开发初探
Feb 14 #Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 #Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 #Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 #Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 #Javascript
You might like
获得Google PR值的PHP代码
2007/01/28 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php操作MongoDB类实例
2015/06/17 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
在python win系统下 打开TXT文件的实例
2018/04/29 Python
django Serializer序列化使用方法详解
2018/10/16 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书