个人对vuex的表象理解(笔记)

一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的

如果简单小型项目,那么不需要vuex,只需要后者就可以,但是如果中大型,尤其是有许多事件传播,那么vuex作用就体现出现了,为什么?ok,$dispatch,$on,这种传播,如果是单向的还好,向上,向下,但是如果非单向,那么必定是先传上去,在传下来,中间还要监听好各自事件别给我整乱了。。。试想一下,一个中大型项目,这里会发生什么?一个字乱,有的时候一个事件,对应的模块都要找半天,而vuex个人感觉相当于中介,又可以看作是模块化,一种对事件通信的模块化处理。。。对一个事件,vuex大体可以看作四步,第一到action里面查到这个事件的触发,然后立马是mutaction里面查看对应处理,第三步改变store的状态,第四部getter视图渲染;

vuex三个关键词:action,mutation,store,中文意思:活动的,突变的,储存的,注意action,mutation,getter都必须是函数

下面一个从无到有一个例子;展示vuex(以中大型结构为例 加减为例)

首先我新建个mutation-type.js,这个文件的目的是申明整个项目存在的事件有哪些。。。代码如下

export const PLUS = ‘PLUS‘
export const MINS = ‘MINS‘
//本例就是两个事件,

接着新建actions文件夹,然后建三个js文件,分别为plus和mins对应的函数操作,以及总的actions文件

代码如下(由于两者相似,以plus为例):

import {PLUS} from ‘../mutation-type‘export const plus = ({dispatch}, num) => {

    dispatch(PLUS, num)
}
意思就是我这里是处理plus的,所以我先把我事件类型里的那个plus导入过来,对组件提供一个plus函数作为接口,这个函数是进行一个plus事件的dispatch操作,所以肯定第一个参数是dispatch,这里函数名可以任何名字,只要与你对应组件里名字对应即可,如果组件里面传的是this,则参数可以直接进行dom操作,用法,num.$el直接获取该组件的dom节点

总的action文件代码如下:

import {del} from ‘./actions/mins‘
import {plus} from ‘./actions/plus‘
export {del,plus}

ok,现在action有了,开始对应的组件,分别plus,mins,display,以及根app,由于mins和plus相似,所以二者只写一个plus;

plus代码如下

<template>
    <div>
        <button @click=‘add(2)‘>Increment +1</button>//为了注明这里的add对应是actions键key而不是value,()里面可以传参数
    </div>
</template>

<script>
    import * as actions from ‘../../vuex/demo3/actions‘
    export default {
        vuex: {
            actions: {
                add: actions.add
            }
        }
    }
</script>
注意:写了actions之后,如果同时具备methods,则method无效,此外,actions里面如果传this的话,则在对应js里面接受可以通过参数的$el,进行dom操作

display组件代码如下:

<template>
    <div>
        <h3>plus is {{num }}</h3>
        <h3>mins is  {{mynum}}</h3>
    </div>
</template>

<script>
    export default {
        vuex: {
            getters: {
                 num:({plus})=>plus.num,//这里getter的第一参数永远默认为是state,很容易理解,因为我获取的是状态,也就是如果你直接写(plus)的话,就必须写成(plus)=》plus.plus.num
                 mynum:({mins})=>mins.num

            }
        }
    }
</script>
注意,如果写了getter继续写data的话,则getter无效,官网上也专门写过getter函数,就是封装相应值得处理

  app代码如下

<template>
    <div>
        <Display></Display>
        <Increment></Increment>
        <mins></mins>
    </div>
</template>
<script>
    import store from ‘../../vuex/demo2/store‘
    import Display from ‘./display.vue‘
    import Increment from ‘./increse.vue‘
    import mins from ‘./mins.vue‘

    export default {
        el:"#app",
        components: {
            Display, Increment,mins
        },
        store:store//这里如果键值一样的话,可以直接简写store
    }
</script>我要随时要监听状态吧,那得在对应模块的根目录上有个状态位吧,所以这里写store,这里有了之后,子组件会自动接收,相当于完成一个类似向下广播和监听的作用

接着是plus的mutations文件代码

import {PLUS} from ‘../mutation-type‘

const state = {
    num: 0
}
const mutations={
    PLUS(state,num){//注意这官网是[PLUS],但是把中括号去掉也是可以,效过没区别,这是因为你mutations-type里面const A =‘A’,变量常量是一样的,如果这里const A= bb这时候这里的[]就有作用了,类似变量匹配的意思;
        state.num=state.num+num
    }
}
export default {
    state,
    mutations
}
这段意思大概是现在actions已经触发了,dispatch了plus事件,我得有个监听处理吧,这的
mutation就是监听对应的时间相当于之前的event选项;你要处理所以第一个参数肯定是state状态啊,第二个就是对应事件传的参数,对外传一个状态和处理函数

 然后各个零件汇总得到store.js代码如下

 

import Vue from ‘vue‘
import Vuex from ‘vuex‘
import plus from ‘./mutations/plus‘
import mins from ‘./mutations/mins‘

Vue.use(Vuex)

export default new Vuex.Store({
   modules:{
       plus,mins
   }
})
这里把这两个事件,看成各自模块,于是module选项里写入各自模块名字,对外提供一个大的vuex实例,注意这里中文文档可能不是这样写的,以英文文档为有效答案

 ok这个时候运行webpack,一个中等项目结构的vuex就形成了,其实回看,既然vuex做了dispacth和boardcast做的事情并取缔了它,那么肯定具备了相应功能,什么时候需要dispatch,boardcast呢,以及哪些玩意需要保存在store里呢?我个人理解为,当一个全局组件需要一个事件才能做出对应响应,需要事件机制,比如说全局有个模态窗口,各个特定组件点击时候,都会显示各个组件对应得data时候,这时候需要事件机制,那么我那些东西需要存在store里面。这里如果有ng经验的,个人觉得可以把这个store70%理解为ng里面的rootscope,也就是类似一个全局的意思,且会根据子组件变动的东西叫store,举个例子,现在有个提示弹窗,里面有按钮和一些提示文字和数字,其中数字会根据子组件变化,而文字是死的,所以这里数字可以存在store里面;那么和localstorege有啥区别?locastorge会自动变化吗?不会,store会

当然这只是理解入门,更深一步操作,还需要各位慢慢琢磨,认识具有反复性和无限性,呵呵

  

  

  

  

时间: 2024-08-13 20:24:25

个人对vuex的表象理解(笔记)的相关文章

Memcached理解笔记4---应对高并发攻击

近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Missing Loading前,强占这其中十几毫秒的时间,进行恶意攻击. 相关链接: Memcached笔记——(一)安装&常规错误&监控Memcached笔记——(二)XMemcached&Spring集成 Memcached笔记——(三)Memcached使用总结  Memcached

网站广告模版理解笔记

电子商务网站的,页面上往往或有很多活动的广告需要频繁的替换,还有关于网站的说明的文章,这些不是经常变动的,还有一些是专区的活动页面,上面放的都是活动的商品. 简单的设计思路: 1.建立一个模版表template,可以根据模版生成html 结构:id.模版名称.状态(有效和无效).模版内容.类型(html和vm) 2.建立一个模版实例表templateInstence,用来存放生成的html的信息 结构:id.templateId.html文件名称.html文件位置 3.建立一个模版实例商品表(非

Memcached理解笔记3---Memcached使用总结

为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题: 使用iBatis整合了Memcached,iBatis针对每台server生成了唯一标识,导致同一份数据sql会产生不同的key,造成重复缓存.——通过重写iBatis部分原码,终止了唯一标识的生成,同一个SQL产生同一个Key,同时对生成key做hash,控制长度,使得数据统一在Memcached. 为了迎合iBatis的架构,通过CacheModel模式,对缓存数据分组管理.最初通过Map实现CacheMode

不理解笔记

# 不明白 # def print_nums(x): # for i in range(x): # print(i) # return # print_nums(10) # ------------------------ # rest=4+0.rest=4+1.rest=4+2.rest=4+3 # def func(x): # res = 0 # for i in range(x): # res += i # return res # # print(func(4)) #不输出字符长度 #

initWithFrame 与 initWithCoder 、awakeFromNib 的方法理解笔记

有时候,知道initWithFrame方法如何用,但是么有弄明白initWithFrame方法到底是什么? 那就通过查资料弄明白. 1. initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法. 2.什么时候用initWithFrame方法? 简单的说,我们用编程方式申明,创建UIView对

bundle的理解笔记

Bundle是一个键值对这样一个东西.就是一个string类型的东西,对应任何类型的东西.就是用来存值的. 这里可以看到他的作用 public void onClick(View v) { String info = etName.getText().toString(); Bundle bundle = new Bundle(); //保存输入的信息 bundle.putString("name", info); Intent intent=new Intent(BundleDemo

Simple-DQN代码的理解笔记

# tenserboard --logdir=logs ,然后打开网页127.0.1.1:6006,可以查看定义网络的神经结构. # 两个神经网络,结构相同,但是参数不一样. # 走多少步再更新,可以自己定义 # target_net 是保存很久以前的的网络的值,冻结之前的神经网络.也叫q-real # eval_net 是实时进行更新的.每走一步,更新一步. # 他的第二个神经网络的输出,就应该等于action的数目,第二层输出的,就是一个q_eval的估计值. # n_l1是神经元的数目 #

cookie&amp;&amp;session再理解笔记

就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你,你到时候拿票来到各个窗口买东西.设置cookie后,第一次执行cookie设置是服务器给浏览器cookie信息,浏览器保存,此后每次就是浏览器拿着cookie信息你去给浏览器.每次请求其他页面,请求头就会把cookie的信息传递过去 第一次执行cookie 此后的话,cookie就由浏览器到服务器了

5.9UI的理解笔记

1.UI的理解 全称user interface  意为:用户界面 UI有view和viewGroup的根基类 view在屏幕上占据一片矩形区域,并会在上面进行内容绘制 viewGroup包含一些view或viewGrorup 用于控制字view的布局事件模型 事件是什么 谁是事件源?  1.注册--->2.触发----> 事件源---->3.生成---->事件---->4.传递---->5.调用---->回调方法 谁是事件监听器? 设置监听器:view.setO