如何快速上手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实现仿京东淘宝竖排二级导航
Dec 08 Javascript
jquery实现点击页面计算点击次数
Jan 23 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
详解webpack2+React 实例demo
Sep 11 Javascript
提升页面加载速度的插件InstantClick
Sep 12 Javascript
node.js支持多用户web终端实现及安全方案
Nov 29 Javascript
微信小程序如何获取地址
Dec 24 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 Javascript
微信小程序反编译的实现
Dec 10 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
php adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
jQuery回调方法使用示例
2017/06/26 jQuery
在vue中封装可复用的组件方法
2018/03/01 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python Deque 模块使用详解
2014/07/04 Python
python制作最美应用的爬虫
2015/10/28 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
Python 音频生成器的实现示例
2019/12/24 Python
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
金融专业个人求职信
2013/09/22 职场文书
自我鉴定写作要点
2014/01/17 职场文书
公司门卫岗位职责
2014/03/15 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
python函数的两种嵌套方法使用
2022/04/02 Python