vuex

vue通信方式
  1. props
    1. 一般属性实现父子通过,函数属性实现子父通信,
    2. 缺点:隔代组件和兄弟组件通信麻烦
  2. vue自定义事件 $emit()
    1. 绑定监听:<myComp @event='callback'
    2. 触发事件:this.$emit('event',data)
    3. 缺点:只适合子父通信
  3. 兄弟组件之间共享数据:EventBus
    1. $on 接收数据的那个组件
    2. $emit 发送数据的那个组件
  4. 消息订阅与发布 :需要引入消息订阅与发布的实现库:如pubsub-js
    1. 订阅消息:PubSub.subscribe(‘msg’,(msg,data)=>{})
    2. 发布消息:PubSub.publish(‘msg’,data)
    3. 优点:可以实现任意关系组件间通信
  5. vuex:
    1. vuex是vue提供的集中式管理vue多组件共享状态数据的vue插件
    2. 优点:对组件间关系没有限制,且相比于pubsub库管理更加集中
vue中直接赋值给数组对象会更新视图吗?需要注意什么?

vue直接给对象数组赋值是不会触发视图更新的

注意:

  1. 对象数组直接修改属性,可以触发视图更新
  2. 删除对象或者数组中的 元素,需要通过key或者数组索引,可以触发视图更新
  3. 通过Vue.set可以设置对象或者数组的值,通过key或者数组索引,可以触发视图更新
  4. 数组赋值为新数组,可以触发视图更新
  5. 使用数组的变异方法,触发视图更新—(push()、pop()、shift()、unshift()、splice()、sort())
vue中computer与watch区别

watch顾名思义,用于监听数据变化,其中可以监听的数据来源有三部分:props、data、computed内的数据;watch提供两个参数(newValue,oldValue),第一个参数是新值,第二个参数保存旧值;

computed用于处理复杂的逻辑运算,主要和methods储存方法来进行区分;methods储存方法,,computed储存需要处理的数据值;methods每次都会调用,computed有缓存机制,只有改变时才执行,性能更佳;

计算属性computed :

  1. 支持缓存,只有依赖数据发生改变,才会重新进行计算

  2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化

    3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过的数据通过计算得到的

  3. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed

5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。

侦听属性watch:

\1. 不支持缓存,数据变,直接会触发相应的操作;

2.watch支持异步;

3.监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;

\4. 当一个属性发生变化时,需要执行对应的操作;一对多;

vuex

Vuex是实现组件全局状态管理的一种机制,可以方便实现组件之间数据共享

优点:1:能够在vuex中集中管理共享的数据,易于开发 2:能够高效实现组件之间数据共享 3:存储在vuex中的数据都是响应式的,能够实时保持数据与页面的同步

  1. state:存储状态(变量),唯一的公共数据源,所有共享数据都要放到state中存储

    1. 组件访问state中数据的第一种方式:

      //在使用vuex时,template中访问数据,this可以省略
      this.$store.state.全局数据名称		
      
    2. 组件访问State中数据的第二种方式:

      //1.从vuex中按需导入mapState函数
      import {mapState} from 'vuex'
      //2通过mapState函数,将当前组件需要的全局数据,映射为当前组件的计算属性
      computed:{
          ...mapState(['count'])//...展开运算符 
      }
      
  2. getters:对数据获取之前的再次编译,是state的计算属性,不会修改原数据,store数据变化,getter的数据也会变化

    getters:{
        showNum:state => {
            return '当前最新数量是['+state.count+']'  } }
    //第一种方式
    this.$store.getters.name
    //第二种方式,在计算属性中
    {{showNum}}//直接渲染
    import {mapGetters} from 'vuex'
    computed: {
        ...mapGetters(['showNum'])
    }
    
  3. mutations:用于修该store中的数据,vuex中不允许组件直接修改数据,在这里的代码不能是异步的

    1. 只能通过mutation变更数据,不可以在组件中直接操作数据

    2. 虽然繁琐,但是可以集中监控所有数据的变化

      //定义mutation
      const store = new Vuex.Store({
          state: {
              count:0
          },
          mutations:{
              add(state){//方法一
                  state.count++ } } })
      //addN(state,step){state.count += step}方法一带参	step外界传过来的值
      //触发mutation
      methods:{
          handle(){
              //触发的第一种方式		commit作用触发mutation	
              this.$store.commit('add')
              //触发第一种方法的带参数	this.$store.commit('addN',3)
          }
      }
      
      //方式二
      //1.从vuex中按需导入mapMutations函数
      import {mapMutations} from 'vuex'
      //2.通过刚才的导入的mapMutations函数,将需要的mutation函数映射到当前组件的methods方法
      methodsL{
          ...mapMutation(['add','addN']),
          handle1() {//handle是绑定的点击事件
              this.add()
          },
          handle2(){
              this.addN(3)
          }
      }
      
  4. actions:处理异步操作

    1. 第一种触发,actions中不能直接调用state数据,需要通过commit触发某个mutation

      //定义Action
      const store = new Vuex.Store({
          mutations:{
              add(state){state.count++} } }),//addN(state,step){state.count += step}
          actions: {
              addAsync(context){//addNAsync(context,step){setTimeout(()=>{context.commit('addN',step)},1000) }}
                  setTimeout(()=>{context.commit('add')},1000) } }
      //触发Action
      methods:{
          handle() {
              //第一种触发		display作用触发actions
              this.$store.dispatch('addAsync') } }//this.$store.dispatch('addAsync',5)
      
    2. 第二种触发

      //1.从vuex中按需导入mapActions函数
      import {mapActions} from 'vuex'
      //2.将制定的actions函数,映射为当前组件的methods函数
      methods:{
          ...mapActions(['addAsync','addNAsync'])
      }
      
  5. modules:模块化vuex,拥有自己的state,getters,mutations,modules,actions

//vuex index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    add(state) {
      state.count++
    },
    addN(state, step) {
      state.count += step
    },
    sub(state) {
      state.count--
    },
    subN(state, step) {
      state.count -= step
    }
  },
  actions: {
    addAsync(context) {
      setTimeout(() => {
        // commit作用触发mutation
        context.commit('add')
      }, 1000)
    },
    addNAsync(context, step) {
      setTimeout(() => {
        // commit作用触发mutation
        context.commit('addN', step)
      }, 1000)
    },
    subAsync(context) {
      setTimeout(() => {
        // commit作用触发mutation
        context.commit('sub')
      }, 1000)
    }
  },
  modules: {}
})

//Subtraction.vue
<template>
  <div>
    <h3>当前最新的count值为: {{count}}</h3>
    <button @click="sub">-1</button>
    <button @click="subN(5)">-n</button>
    <button @click="subAsync">-1async</button>
  </div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex'
export default {
  data() {
    return {
    }
  },
  computed: {
    ...mapState(['count'])
  },
  created() {
  },
  methods: {
    ...mapMutations(['sub', 'subN']),
    ...mapActions(['subAsync'])
    // btn9() {
    //   this.sub()
    // },
    // btn8() {
    //   this.subN(5)
    // },
    // btn7() {
    //   this.subAsync()
    // }
  }
}
</script>
<style>
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值