重学Vue2(知识点总结,方便查阅)

91 阅读4分钟

1.什么是vue

Vue 是一套用于构建用户界面的渐进式框架

2.{{}}--模板语法--双大括号赋值法

在vue中{{}}被称之为模板语法  双花括号赋值法  vue数据插值。 

作用:就是可以在双大括号中写入表达式 并且展示在页面中

语法:在你想展示数据的任何位置   {{表达式}}   (表达式  通过计算可以返回结果的公式)

3.指令

通过写在html开标签中,v-开头的特殊属性, 可以扩展标签的功能

  1. v-model :双向绑定
  2. v-text:向dom中插入文本内容,和{{}}作用一样
  3. v-html:就是把字符串标签插入到页面中,可以解析标签
  4. v-show:控制dom元素的显示隐藏(通过控制css样式控制)
  5. v-if:控制dom元素的移除与添加,效果与v-show类似,但是原理不同,v-if控制的是dom元素的移除与添加。
  6. v-on:给dom元素绑定事件,v-on:click="函数名”可以简写为@click="函数名"
  7. v-for:遍历数据 v-for="(遍历的值,遍历的下标) in 你要遍历的数据",一般要与key搭配使用,key表示遍历出来的元素的唯一标识,可以增加遍历生成都没元素的效率,不建议使用下标。
  8. v-bind:给html标签的属性插入变量,可以简写为“:”
  9. v-once:一次性插值,数据插入到页面中后就不会被改变了
  10. v-clock:等待vue实例渲染完成之后在进行

注意:

  1. v-if与v-for可以同时使用,但是不推荐同时使用,v-for 具有比 v-if 更高的优先级,如果同时使用,会将分别重复运行于每个 v-for 循环中,影响速度,如果必须使用,建议v-if嵌套v-show
  2. 屏幕闪烁问题, 当用户的设备和网络比较慢的时候可能就会在页面中吧{{}}全部展现出来   当网络恢复正常之后  有突然间显示ok,解决办法:可以使用v-text,或者使用v-clock指令

4.事件对象--$event

谁触发这个事件事件对象就指向谁 (事件对象中包含触发这个事件的元素所有信息)类似于拖拽

<input type="text" @keydown="fun($event)">
fun(e) {
	console.log(e)
  if (e.keyCode == 90) {
  	console.log("z被按下了")
	}
}

5.修饰符

通过vue提供的修饰符可以来处理dom事件的一些细节性的内容

v-on:事件.修饰符="函数()"

按键修饰符

.up   .down    .left   .right     .ctrl     .space     .enter    .tab   .delete  .shift    .esc

<div id="demoDiv">
	<input type="text" @keydown.space="fun()">
</div>
<script>
	let vm = new Vue({
  	data: {
		},
    methods: {
        fun() {
            console.log("空格被按下了")
        
        }
    }

  })
  vm.$mount("#demoDiv") 
</script>

事件修饰符

  1. stop修饰符    阻止事件传播
  2. prevent修饰符   阻止事件默认行为
  3. captrue修饰符    设置捕获
  4. self 修饰符    只会触发自己范围内的事件 不包含子元素
  5. once修饰符   只触发当前事件一次

v-model修饰符

  1. lazy修饰符:只有当用户的input中失去焦点或者用户点击回车按钮时,才会将的数据进行修改。
  2. number修饰符:当用户在input中输入数字时,浏览器会默认将输入的数字转化为string类型,使用number修饰符来将输入的数字转为number类型
  3. trim修饰符:使用trim修饰符来去掉字符串首部或者尾部的所有空格

6.计算属性(computed)

当一条数据,在不同位置展示出不同形态的时候 ,可以使用计算属性。计算属性就是通过加工计算返回一个新的结果,就是计算属性,使用的时候不加()

传统写法

get方法:必须要写,该函数不接受参数,当初次读取计算属性或者计算属性所依赖的数据发生变化时被调用,getter函数有一个返回值,该返回值就是计算属性的值

computed:{
       计算出存储结果的名字:{
          //必须要写,该函数不接受参数
          //什么时候被调用?:当初次读取计算属性或者计算属性所依赖的数据发生变化时被调用,getter函数有一个返回值,该返回值就是计算属性的值
           get(){
              return 你的计算逻辑
           },
           //set方法: 可选项 接受一个可选参数(计算属性被修改之后的值)当计算属性的值被修改时被调用
            set(value){
            }
        }
    }

// 案例

<body>
    <div id="demodiv">
       
       <h1>读取data中的数据--{{text}}</h1>

       <input type="text" v-model="newtext">
       <h1>读取计算属性的数据--{{newtext}}</h1>
    </div>
    <script>
        let vm=new Vue({
            el:"#demodiv",
            data:{
                text:"abcdefghijk"
            },
            // 计算属性
            computed:{
                newtext:{
                    get(){
                        console.log("我是计算属性的get方法")
                        return this.text.toUpperCase()
                    },
                    set(value){//当newtext被修改的时候set就会触发 value就是修改之后的数据
                        console.log("我是计算属性的set方法",value)
                    
                    }
                }
            }, 
        })
       
    </script>
</body>

简写写法(推荐)

computed:{
	你处理好的变量(){
		return 你的处理逻辑
	}
}

注意

  1. 计算属性是依赖data里面的数据的,当依赖的data数据反生改变时,计算属性触发,返回新的结果
  2. 计算属性多次调用,但是只触发一次,因为计算属性是依赖缓存的。

7.watch监听/侦听

watch是vue实例的一个属性  他的作用就是用来监听data中的数据   当数据变了watch就会触发  从而调用函数处理一些逻辑

简写方法

watch:{
	你要监听的data数据(newval,oldval){			
	}
}

传统写法

watch:{
  text:{
    // data监听的数据改变触发的回调函数
    handler(newVal,oldVal){
      console.log('aaa')
    },
    // deep,代表是否开区深度监听
    deep:true,
      // 初始化是否执行
    immediate:true
  }
}

注意

  1. 受现代 JavaScript 的限制.  Vue 不能检测到对象属性的添加或删除。需要深度监听则需要设置deep属性来完成深度监听
  2. deep会把对象中的所有属性都监听到,不管是否需要监听, 这样性能开销就会非常大,解决方法:可以使用字符串形式进行监听,如 "obj.name"
  3. watch默认初始化是不会触发的,初始化需要触发需要通过设置immediate属性完成

8.计算属性与watch的区别

计算属性 :  计算属性是依赖data的数据 当data的数据改变之后  计算属性会重新计算返回一个新的结果

watch:  watch是监听data的数据 当data的数据改变之后  watch会调用一个回调函数完成一些特定的逻辑

计算属性是同步的  watch是异步的

计算属性(computed)属性检测(watch)
首次运行首次不运行
默认深度依赖默认浅度观测
适合做筛选,不可异步适合做执行异步或开销较大的操作

9.钩子函数

在vue中可以自动执行的函数叫做钩子函数

8大生命周期钩子函数

时期函数功能
实例创建之前beforeCreate数据的观测与事件的初始化
实例创建之后createdvue实例已经创建完毕
模板渲染之前beforeMount页面还没有进行渲染与模板的编译 程序在此时会把数据绑定到页面上  但是页面并没有显示
模板渲染之后mounteddom元素渲染完成
数据更新之前beforeUpdate数据会不停的在dom中进行修改
数据更新之后updated修改之后的dom内容已经在页面成功的展示了
实例销毁之前beforeDestory此时vue实例还能用
实例销毁之后destoryed什么都没有了 vue实例等内容都没了

10.自定义指令

在现有内置指令不够用的时候 我们可以自己定义指令来进行使用

自定义指令生命周期钩子函数

bind   指令绑定到元素之上的时候执行 但是只执行一次

unbind 指令被移除的时候执行  只执行一次

update  所有组件节点更新的时候执行调用

componentUpdate 指令所在节点以及所有的子节点都更新完成的时候调用

inserted 绑定指令的元素在页面展示的时候调用

全局自定义指令--directive(定义在main.js文件中)

Vue.directive("自定义指令名字",{
  // el表示dom元素
  // binding表示接受的参数
  自定义指令钩子函数(elbinding){
      你的逻辑
  }
})

局部自定义指令--directives

directives:{
	自定义指令的名字:{
    // el表示dom元素
    // binding表示接受的参数
		自定义指令的钩子函数(el,binding){
				你的逻辑
		}
	},
	自定义指令的名字2:{
	},
}

11.组件

组件的本质就是自定义标签,增加了开发效率,降低了维护难度,复用性更高

全局组件--component

只需要在main.js中配置一次,就可以在所有项目中任意位置直接使用了(全局组件应该慎用,全局组件可能会造成组件命名混乱)

import Vue from 'vue'
import App from './App.vue'

// 1.引用
import AllCom from "./components/AllCom.vue"
// 2.配置全局组件
// Vue.component(“给你这个全局组件起个名字”,你所要对应使用的组件)
Vue.component("AllCom",AllCom)

局部组件--components

局部组件,谁使用就谁引用(使用顺序,先引用,再调用,最后再使用)

<template>

  <div>
    <!-- 3.使用 -->
    <Bottombar></Bottombar>
    <List></List>
    <Slider></Slider>
  </div>
 
</template>

<script>
// 1.引用 组件的名字要大写
import Bottombar from "./components/BottomBar/BottomBar.vue"
import List from "./components/ListCom/ListCom.vue"
import Slider from "./components/SliderCom/SliderCom.vue"

export default {
  name: 'App',//命名空间   给这个组件起个名字
  // 2。调用
  components:{
    // 名字:你引用的组件
    Bottombar,
    List,
    Slider
  }

}
</script>

组件样式隔离--scoped

使用scoped属性可以让 当前样式仅对当前组件生效

<style scoped>
 div{
    color:green;
  }
</style>

vue组件的data为什么是个函数

数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。

组件传值(组件通信)

父组件的数据子组件不能直接使用,同样的,子组件的数据父组件也不能直接使用,组建于组件之间是一个完整的个体,他们之间的数据默认是不能直接进行交互的。

正向传值 --父向子(自定义属性传值)

props是vue实例的一个属性  他的作用是用来让组件接受外部传递进来的数据

基本props使用

  1. 在子组件中使用props定义接收参数
  2. 父组件在组件内定义需要传递的参数
  3. 注意 父组件在给子组件添加自定义属性时,自定义的属性名要与子组件内props内定义的接收参数名称一致
<!-- 子组件 -->
<template>
  <div>
      <!-- 2.使用 -->
      zizizizizizizzi--{{xiaoming}}---{{xiaohong}}
  </div>
</template>

<script>
export default {
    // 1.定义接收参数
    props:["xiaoming","xiaohong"]
}
</script>
<!-- 父组件 -->
<template>
  <div>
      fuffufufufufufufuf
      <!-- 在子组件被调用的地方  把props的参数当成属性进行传值 -->
      <Zicom :xiaoming="text" :xiaohong="num"/>
  </div>
</template>

<script>
import Zicom from "./ZiCom.vue"
export default {
    components:{
        Zicom
    },
    data(){
        return {
            text:"我是字符串",
            num:18
        }
    }
}

props验证语法

如果想限制父组件给子组件传递的数据类型时候  那么就可使用props验证,props验证可以对传递给子组件的数据  进行约束(数据类型  默认值  等)

<template>
  <div>
      <!-- 2.使用 -->
      zizizizizizizzi--{{xiaoming}}---{{xiaohong}}
  </div>
</template>

<script>
export default {
    // 1.定义接收参数
    // props:["xiaoming","xiaohong"]

    // props验证
    props:{
       xiaoming:{
           type:String,
         	 default:'默认值'
       },
       xiaohong:{
           type:Boolean
       }
    }
}
</script>

<style>

</style>

逆向传值 --子向父

使用自定义事件完成逆向传值

  1. 子组件:通过emit定义一个自定义事件,语法:this.emit定义一个自定义事件,语法:`this.emit("自定义事件的名字",你要传递的数据)`
  2. 父组件:触发自定义事件接收值 语法:<Zicom @zipao="fun"/> 父组件触发的函数的形参就是接受的参数
<!-- 子组件 -->
<template>
  <div>
    zzizizizizizizizi
    <!-- 1.通过事件调用一个自定义事件的创建 -->
    <button @click="fun()">点我逆向传值</button>
  </div>
</template>

<script>
  export default {
    data(){
      return {
        zitext:"我是子组件的数据么么哒!!!!!"
      }
    },
    methods:{
      fun(){
        // 2.在函数中使用$emit来创建一个自定义事件
        // this.$emit("自定义事件的名字",你要传递的数据)
        this.$emit("zipao",this.zitext)
      }
    }
  }
</script>

<!-- 父组件 -->
<template>
  <div>
      fufufufufufufuf
      <Zicom @zipao="fun"/>
  </div>
</template>

<script>
import Zicom from "./ZiCom.vue"
export default {
    components:{
        Zicom
    },
    methods:{
        // 有个形参  这个形参接收的就是刚才自定义事件的第二个参数
        fun(val){
            console.log(val)
        }
    }
}
</script>

通过ref完成传参

把ref绑定到子组件身上  那么就可以得到当前这个子组件的所有信息  包含他的data数据以及methods方法从而完成了逆向传值

<template>
  <div>
      fufufufufufufuf
      <Zicom ref='ziMsg' />
  </div>
</template>

<script>
import Zicom from "./ZiCom.vue"
export default {
    components:{
        Zicom
    },
    mounted(){
      // 接收参数
      console.logthis.$refs.ziMsg.zitext)
    }
}
</script>

中央事件总线 --eventbus

中央事件总线:就是凌驾在两个兄弟组件之上的一个空vue实例  这个实例建立起了一个数据流动的桥梁

  1. 创建一个index.js。在js中创建一个新的vue实例
import Vue from  'vue'
export default new Vue()
  1. 将要传的数据的组件,先把数据通过$emit自定义事件把数据挂载到这个空的vue实例上
<template>
  <div>
    兄弟b
  </div>
</template>
<script>
  import eventBus from 'index.s'
  export default {
    daat(){
      return{
        text:"a组件内容"
      }
  	}
    mounted(){
      // eventBus.$emit('事件名',传递的参数)
      eventBus.$emit('evb',this.text)
  }
</script>
  1. 接收参数的组件,通过$on监听实例上的自定义事件,从而完成同胞传值
<template>
  <div>
    兄弟b
  </div>
</template>
<script>
  import eventBus from 'index.s'
  export default {
   
    mounted(){
      // eventBus.$on("你要监听的自定义事件名",(val这个形参就是你监听自定义事件上面的数据)=>{})
      eventBus.$on('evb',(val)=>{
      	console.log(val)
      })
    }
  }
</script>

状态提升

把原有放在组件身上的数据  全部统一放到他们共同的父组件身上  旧免去了复杂的数据传递

12.前后端交互

fetch VS axios VS ajax区别

  1. 传统的ajax就是指使用XMLHttpRequest方法实现的数据请求, 他隶属于原生的js  核心就是XMLHttpRequest对象 ,如果多个请求有先后顺序的话  那么容易造成回调地狱问题
  2. .axios 是基于promise封装的  本质上还是XMLHttpRequest的封装 只不过他是基于最新的语法进行封装的
  3. .fetch 就是原生js最新标准  和XMLHttpRequest没有半点关系

axios的使用

  1. 下载axios :npm install --save axios
  2. 引用:import axios from 'axios'
  3. 使用:axios({url:,method:'请求方式'}).then((res)=>{}).catch((err)=>{})

序列化参数

axios发送post请求时,请求头Content-type(表示请求和响应中的媒体类型信息)常见有三种形式:

  1. Content-Type: application/json  就是给后台的数据是一个json对象
  2. Content-Type: 最主流的是application/json形式表单数据编码为键值对,&分隔 如:name=java&age = 23
  3. Content-Type: multipart/form-data 通常文件上传

最主流的是application/json形式,axios默认也是这种形式,但是如果后端要求必须以最主流的是application/json形式,那么通过json的新式传递参数,后端是无法接受的,后端接收不到必须使用参数数据进行序列化处理才行

使用qs模块来序列化参数

  1. 下载  npm install --save qs
  2. 引用 import qs from “qs”
  3. 在传递数据的时候使用qs序列化
let key=qs.stringify({
            key:val
})

// 引用qs
import qs from 'qs';

  // 序列化数据
  let key=qs.stringify({
      name:"xixi"
  })
      // 传递
    axios.post("/api/userlist/post",key).then((ok)=>{
      console.log(ok)
    }).catch((err)=>{
      console.log(err)
    })
  }

跨域

因为浏览器的安全机制 同源策略   不同端口不同域名不同协议  就会造成跨域

解决跨域的方法:

  1. nginx反向代理
  2. jsonp
  3. cors:后端解决跨域
  4. devServer代理跨域:

devServer他就是一个vue脚手架中那个内置的微型开发小服务器 可以让他代理去发送请求  这样一来就不经过浏览器了  没有经过浏览器 那么就没有同源策略  没有同源策略就没有跨域  从而就解决了跨域

devServer就是vue脚手架中那个内置的微型开发小服务器--注意    上线之后 该种方式就会失效

步骤:

  1. 在项目的根路径下 创建一个vue.config.js
module.exports={
    devServer: {
        proxy: {  //配置跨域
          '/api': {
            target: 'http://www.weather.com.cn/',  //需要解决跨域的地址
            pathRewrite: {
              '^/api': '' 
            }
          },
        }
      },
}
  1. 修改请求路径
<template>
  <div>
      <h1>大纲要修写法</h1>
        <button @click="fun()">点我请求数据</button>
  </div>
</template>

<script>
import $http from "axios"
export default {
    methods:{
        fun(){
           $http({
            //    修改名字
               url:"/api/data/cityinfo/101320101.html",
               method:"get",//没有s
           }).then((ok)=>{
               console.log(ok)
           }).catch((err)=>{
               console.log(err)
           })
        }
    }
}
</script>

axios封装

在大型项目中,http请求会特别的多,而不同模块的请求接口都需要区分,所以可以把数据请求拆分出来单独管理,增加项目的可维护性和扩展性。

封装步骤:

  1. api 请求集中式管理
  2. 实现请求拦截
  3. 实现响应拦截
  4. 常见错误信息处理
  5. 请求头设置

api请求集中管理

  1. 初始化axios实例,在util文件夹中添加request.js文件。通过create()方法创建axios实例,该实例上可配置拦截器
import axios from "axios"
// 创建 axios 请求实例
const instance = axios.create({
  baseURL: "", // 基础请求地址
  timeout: 10000, // 请求超时设置
});
export default serviceAxios
  1. 创建api文件夹,编写不同的js接口文件,完成api请求的集中管理
import request from "../util/index.js"

export let funget=()=>{
    return request({
        url:"/api/userlist/get",
        method:"GET",
        params:{
            name:"xixi"
        }
    })
}
  1. 在组件中使用
// 引用
		import {funget} from "../api/index.js"


        // 使用
        funget().then((ok)=>{
            console.log(ok)
        })
    }

axios拦截器

拦截器: 每次发送请求或者请求相应的时候  都会经过拦截器  才会进入到我们的程序(就是对我们的请求和响应进行发送前或者获取前的一个拦截  )

请求拦截: 在请求发送前进行拦截,或者对请求错误进行拦截

响应拦截:在请求结果返回后,先不直接显示错误,而是先对响应码等等进行处理,处理好后再导出给页面一个错误提醒

import axios from "axios"
// 创建 axios 请求实例
const instance = axios.create({
  baseURL: "", // 基础请求地址
  timeout: 10000, // 请求超时设置
});
// 请求拦截
instance.interceptors.request.use(
  config => {
    // config为AxiosRequestConfig的一个实例,它是包含请求配置参数的对象
    // 在这里可以在请求发送前做一些处理,如向config实例中添加属性,取消请求,设置loading等  
    可以设置全屏加载,可以设置令牌(token)
    return config
  },
  // 这里是请求报错时的拦截方法,这里直接返回一个状态为reject的promise
  // 实际测试时,即使前端请求报错并且未到达后端,也没有触发这里的钩子函数
  error => Promise.reject(error),
)
// 响应拦截
instance.interceptors.response.use(
  response=>{
    return response
  },
  error=>{
    // 对错误响应数据进行处理
    return Promise.regect(error);
  }
)
export default instance

13.vue配置与部署baseurl配置

环境变量

在开发的时候一般会有是三个环境:开发环境 测试环境 线上(生产)环境

vue 中有个概念就是模式,默认先vue cli 有三个模式

  • development开发环境模式用于 vue-cli-service serve
  • production生产环境模式用于 vue-cli-service build 和 vue-cli-service test:e2e
  • test测试环境模式用于 vue-cli-service test:unit

实际开发中:

  • 本地环境(local)
  • 开发环境(development)
  • 测试环境(devtest)
  • 预发布环境(beta)
  • 生产环境(production)

创建不同的环境变量文件

通过为.env文件增加后缀来设置某个模式下特有的环境变量。

  1. 在项目根路径下设置  新建对应文件 .env.development(开发环境文件) .env.production(生产环境文件).env.devtest(测试环境文件)
  2. 在每个文件写入(VUE_APP_随便写) VUE_APP_XIAOMING = "开发模式"

打包生产环境

1.npm run build 会生成一个dist文件夹  

2.配置生产环境    

(1)在vue.config.js中设置 publicPath:"./"  

(2)把路由模式设置为hash

3.重新build

默认请求地址:baseurl

可以配置不同的环境变量,可以在设置请求的时候  根据不同的环境来设置不同的请求地址

1.在开发环境文件中配置我们的请求(今后开发的时候可以在其他配置文件中配置你的请求)

VUE_APP_XIAOMING = "开发模式"
VUE_APP_API = "http://localhost:8888"

2.在封装的拦截器文件中配置baseURL

let axiosurl = ""
// 如果为开发模式的话执行url
if(process.env.NODE_ENV === 'development' ){
  axiosurl=process.env.VUE_APP_API
}
else{
  // 否则设置成其他的模式(这里今后有很多个判断)
  axiosurl=process.env.VUE_APP_API
}

// 创建axios 赋值给常量service 
const service = axios.create({
  baseURL: axiosurl
});

3.在今后的请求中直接写请求的路由地址就行

// 发送请求 url中请求地址前缀已经在baseURL中配置了
  link("/one").then((ok)=>{
    console.log(ok)
  })

14.Vuex

vuex是什么?

vuex就是在vue中的统一状态(数据)管理工具  把项目下的所有数据  统一的放到这个仓库里面  组件谁想用 谁就去这个仓库里面取  没有了复杂的数据流动

vuex的5大属性---state---数据源

state的作用就是在vue中存放数据

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {//就是数据源  存放数据的地方
    text:"我是字符串",
    num:18,
    bool:true,
    arr:[1111,2222,3333],
    obj:{
      name:"xixi",
      age:18
    }
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

使用state中的数据: 直接读取:this.$store.state.变量名,可以在计算属性中直接读取使用

vuex的5大属性---module---模块

随着项目体积的逐渐增大,变量增多,文件中的内容也将会越来越冗余,后期维护困难也怎增大,为了避免这种情况发生,可以使用xuex的模块ban鹅绒进行拆分

  1. 在文件夹下创建一个store来存储我们拆分的模块
  2. 创建模块文件
let aboutm={
    state: {//就是数据源  存放数据的地方
        text:"我是字符串",
        bool:true,
    },
    getters: {
    },
    mutations: {
    },
    actions: {
    },
}
// 必须暴露
export default aboutm
  1. 在index.js文件中关联并使用
import Vue from 'vue'
import Vuex from 'vuex'
// 1.引用模块
import homem from "./modules/homem.js"
import aboutm from "./modules/aboutm.js"
Vue.use(Vuex)
export default new Vuex.Store({
  modules: {//2配置模块
    homem,
    aboutm
  }
})

注意:如果使用模块,读取模块中state的数据时需要加模块名:this.$store.state.模块名.xxxxx

vuex的5大属性---mutations---修改数据(同步方法)

mutations的作用就是在vuex中修改state的  如果想修改state的数据必须使用mutations来修改,mutations是一个属性,属性中包含若干个修改方法,调用mutations中的方法就必须使用commit()进行调用

let aboutm={
    state: {//就是数据源  存放数据的地方
        text:"我是字符串",  
        bool:true,
      },
      getters: {},
      mutations: {
          我是修改函数1(state,payload){
            // state,表示state中的数据
            // payload,表示调用方法时传递的数据
            cosnoel.log(payload.inputval)
          },
          我是修改函数1(){},
          // ...
      },
      actions: {},
}
// 必须暴露
export default aboutm

组件内使用:

methods:{
  fun(){
    // this.$store.commit('方法名'[,参数]) 
    this.$store.commit("NUM_LIST_ADD_DATA")
          this.$store.commit("NUM_LIST_DEL_DATA",{inputval:this.inputval})
  }
}

vuex5大属性---actions---异步触发器

actions是在vuex中进行异步操作的触发器,可进行异步请求的发送,在组件内使用dispatch 触发vuex的actions进行异步操作  把请求来的数据 通过commit调用mutations 修改state

mutations:{
  AXIOSDATA(state,payload){
    state.abc = payload.data
  }
},
actions: {
    // context代表的就是vuex 的store对象
    AXIOS_CESHI(context,payload){
        // 在actions中就可以写请求
        $http({
            url:payload.url,
            method:"get"
        }).then((ok)=>{
          // 把请求来的数据通过context.commit()触发修改
						context.commit("AXIOSDATA",{data:ok.data})
            console.log(ok.data)
        })

    }
},

vuex5大属性---getters---vuex的计算属性

vuex的getters属性也就是计算属性 他和computed最大的区别就是 他处理的数据可以在任何组件直接使用  而vue的computed  处理的数据只能在当前组件使用

getters: {
    // state就是上面的数据源
    newtext(state){
        return state.text.toUpperCase()
    }
},

使用:this.$store.getters.xxx

由于本周工作内容较多,先把整理的这一部分发出来,和面继续补

未完待续