web前端——Vue

杂项知识点

  1. vue的实例属性和实例方法用$修饰。如vm.$watch(对象){}。$set
  2. 过滤器 又称管道符 : | ←就是这个竖线! 叫管道符

    将一串左侧数据拿去处理,处理完之后继续拿来用,且不会影响原来的数据,也不会改变。

  3. v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

Vue基础

1、初始vue:

  • 想让vue工作,就要创建一个vue实例,且要传入一个配置对象。
  • root容器中的代码依然符合html规范,只不过混进了一些特殊的vue语法。
  • root容器中的代码被称为【vue模板】
  • Vue实例和容器是一 一对应的。
  • 真实开发中只有一个Vue实例,并且会配合组件一起使用。
  • {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性。
  • 一旦data中的数据发生改变,那么页面中的用到该数据的地方都会自动更新。

        区分js表达式和js代码:

                1、js表达式:一个表达式会生成一个值,可以放在任何一个需要值的地方。如:a,a+b,demo(1),x===y?'a':'b'。

                2、js代码(语句):if(){},for(){}

2、Vue特点

  • 采用组件化模式,提高代码复用率,且让代码更好地维护。
  • 声明式编码,让编码人员无需直接操作DOM,提高开发效率。
  • 使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点。

3、模板语法

  • 插值语法

                功能:解析标签体内容。

                写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。

  • 指令语法

                功能:用于解析标签(标签属性,标签体内容,绑定事件)。

                举例:v-bind:href=“xxx” 课简写为  :href=“xxx”。可直接读取data中的所有属性

 4、数据绑定

  • 单向绑定:数据只能从data流向页面,而不能从页面改变data中数据。
  • 双向绑定:数据不仅能从data流流向页面,还可以从页面流向data。

        备注:1、双向绑定v-model=一般都应用在表单类元素中,(input、select等表单)

                   2、v-model:value=可以简写成v-model=,因为v-model默认收集的是value值。

 5、el和data

  • el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串

        el的两种写法:

                        1、new Vue时候紧接着配置el属性。

                        2、先创建new实例,随后再通过vm.$mount('#root')指定el的值。

  • data中用于存储数据,数据供el所指定的容器去使用。

        data的两种写法

                        1、对象式

                        2、函数式。使用组件式,必须采用函数式。

一个重要原则:由Vue管理的函数,不要使用箭头函数,若使用箭头函数,this就不再是Vue实例。

 6、MVVM模型

        M:模型。data中的数据。data中所有属性,最后都出现在vm身上。

        V:视图。模板代码。

        VM:视图模型(工具)。Vue实例。vm身上所有的属性及Vue原型上所有属性,在Vue模板中都可以直接使用。

7、数据代理

回顾Object.defineproperty方法:设置或增加属性

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

  • Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
  • Vue中数据代理的好处:更加方便地操作data中的数据。
  • 基本原理:        

        通过Object.defineProperty()把data对象中所有属性添加到vm实例上。

        为每一个添加到vm上的属性,都指定一个getter/setter。

        在getter/setter内部去操作(读/写)data中对应的属性。

8、事件处理

事件的基本使用

  • 使用v-on:xxx或@xxx绑定事件,其中xxx是事件名。
  • 事件的回调需要配置在methods对象中,最终会在vm实例上。
  • methods中配置的函数,不要用箭头函数。否则this就不是vm实例了。
  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm实例或组件实例对象。
  • @click=“demo”和@click=“demo($event)’”效果一致,但后者可以传参。

 事件修饰符

  • prevent:阻止默认事件。
  • stop:阻止事件冒泡(常用)
  • once:事件只触发一次(常用)
  • capture:使用事件的捕获模式
  • self:只有event.target是当前操作的元素时才触发元素。
  • passive:事件的默认行为立即执行,无需等待时间回调执行完毕

 键盘事件

  • Vue中常用的按键别名:

        回车:enter

        删除:delete(删除和退格键位)

        退出:esc

        空格:space

        换行/切换:tab(必须配合keydown使用)

        上up 下down 左left  右right

  • Vue未提供别名的按键,可以使用按键原始的key值去绑定,但要注意转为kebab-case(短横线命名)。
  • 系统修饰键:ctrl、alt、shift、meta

                1、配合keyup使用:按下修饰键的同时,再按下其他键,随后配合释放其他键,事件才被触发。

                2、配合keydown使用:正常触发事件。

  • 也可以使用keyCode去指定具体的按键(不推荐)
  • Vue.config.keyCodes 自定义键名=键码,可以去定制按键别名

9、计算属性(computed)

  • 定义:要用的属性不存在,要通过已有属性计算得来
  • 原理:底层借助了Object.defineproperty方法提供的getter和setter方法。
  • get函数什么时候执行:

                1、初次读取时会执行一次。

                2、当依赖的数据发生变化时会被再次调用。

  • 优势:月methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
  • 备注:

                1、计算属性最终会出现在vm实例上,直接读取使用即可。

                2、如果计算属性要被修改,那必须的写set函数去响应修改,切set中要引起计算时依赖  的数据发生改变。

完整写法:

 简写:

10、监听属性(watch)

  • 监听属性watch:

        当被监听的属性发生变化时,回调函数自动调用

        监听的属性必须存在,才能进行监视。

        监听的的两种写法:1、new Vue时写入watch配置。2、通过vm.¥watch监听

  •  深度监听:

        vue中的watch默认不监听对象内部值的改变(只监听一层)

        配置的deep:true可以监听对象内部值变化(可以监听多层)

  • 面试题:computed和watch之间的区别:

        某种意义上讲,watch>computed,因为watch可以异步操作(例如使用定时器,当需要在数据变化时执行异步或开销较大的操作时, watch 方式是最有用的。其允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。)。

  • 重要原则:

        1、所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。

        2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

11、绑定样式(CSS)

  • class样式

        写法::class="xxx"  xxx可以是字符串、对象、数组。

        (字符串写法适用于:类名不确定,要动态获取)

        (对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。)

        (数组写法适用于:要绑定多个样式,个数确定,名字也确定。)

  • style样式

        :style=“{fontSize:xxx}”其中xxx是动态值。

        :styel=“{a,b}” 其中a和b是样式对象。

12、条件渲染

  • v-if

        写法:v-if=“表达式”,v-else-if=“表达式”,v-else。表达式为true时,此元素执行

        适用于切换频率较低的场景,表达式为false的DOM元素直接移除

        写法的三者一起使用,中间不能被打断。

  • v-show

        写法:v-show=“表达式”

        适用于切换频率较高的场景。表达式为false的DOM元素未被移除,而是被隐藏

  • 使用v-if时,元素可能无法获取到,而v-show一定可以获取到。

13、列表渲染

  • v-for遍历指令:

        1、用于展示列表数据

        2、语法:v-for=“(item,index)in xxx”:key=“yyy”

        3、可遍历:数组、对象、字符串(很少)、指定次数(很少用)。

  • 面试题:vue中的key有什么作用(key的内部原理):

  •  Vue监视数据的原理:

        1、Vue会监视data所有层次的数据。

        2、监测对象:通过setter实现监视,且要在new Vue时就要传入要监测的数据。

                

        3、 监测数组:通过包裹数组更新元素的方法实现      。  

                                (调用原生对应的方法对数组进行更新;重新解析模板,更新页面)

        4、数组变化原生方法:push(),pop(),shift(),unshift(),splice(),sort(),reverse()。Vue方法:Vue.set()或vm.$set()。

        5、特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象添加属性!!!

 14、收集表单数据

  • 若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。
  • 若:type为radio,则v-model收集的是value值,该value值是人为配置好的。
  • 若:type为checkbox:

        当没有配置input的value属性时,收集的就是checked(勾选or未勾选,结果是布尔值

        当陪值了value值时:       

                v-model的初始值是非数组,那么收集的是checked(勾选or未勾选,结果是布尔值)

                v-model的初始值是数组,收集的是value组成的数组。

  • v-model的三个修饰符:

        1、lazy:失去焦点再收集数据。

        2、number:输入字符串转为有效的数字。

        3、trim:输入首尾空格过滤。

15、过滤器

  • 定义:对要现实的数据进行特定格式化后再显示(用于一些简单逻辑的处理)。
  • 语法:

        1、注册过滤器:Vue.filter(name,callback)或new Vue(filters:{})

        2、使用过滤器:{{xxx丨过滤器名}}。

  • 备注:

        1、过滤器也可以接受额外参数,多个过滤器可以串联。

        2、并没有改变原来的数据,而是产生新的相应数据。

16、内置指令

回顾学过的指令:

  • v-text指令:

        1、作用:向其所在的节点中渲染文本内容。        

        2、与插值语法的区别:v-text会替换掉节点中的内容,只保留文本,插值语法{{}}不会

  • v-html指令:

        1、作用:向指定节点中渲染包含html结构的内容。

        2、与插值语法的区别:

                v-html会替换掉节点节点中的内容,插值语法{{}}不会。

                v-html可以识别html结构

        3、v-html有安全性问题。

                在网站动态渲染任意HTML是危险的,容易导致XSS攻击。

                一定要在可信的内容上使用v-html,永不要用在用户提交的内容上。

  • v-cloak指令(没有值):

        1、本质是一个特殊属性,Vue实例接管此节点后,会删掉v-cloak属性

        2、使用css配合v-cloak可以解决网速慢时网页展示出{{xxx}}问题。

  • v-once指令:

        1、v-once所在节点在初次渲染后,就视为静态内容了,不再改变。

        2、以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

  • v-pre指令:

        1、跳过其所在节点的编译过程。

        2、可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

17、生命周期

生命周期内涵:

  • 又名:生命周期回调函数、生命周期函数、“钩子”、
  • 生命周期函数式Vue在关键时刻帮我们调用的一些特殊名称的函数。
  • 生命周期函数的名字不可更改,但函数的具体内容是程序猿根据需求编写的。
  • 生命周期函数中的this指向的是vm或组件实例对象

常见的生命周期函数(钩子):

  • mounted:可进行 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等初始化操作
  • beforeDestory:清楚定时器、解绑自定义事件、取消订阅消息等收尾工作

关于销毁Vue实例:

  • 销毁后借助Vue开发者工具看不到任何消息。
  • 销毁后自定义事件会失效,但原生DOM时间依然有效。
  • 一般不会在beforeDestory操作数据,因为即便操作数据,也不会再触发更新流程了。

18、非单文件组件

Vue中使用组件的三大步骤:

        1、定义组件(创建组件)

        2、注册组件

        3、使用组件(写组件标签)

  •  一、如何定义一个组件?

        使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个option几乎一样,但也有区别。区别如下:

                el不要写:最终所有的组件都要经过一个vm的管理,由vm中的el决定服务       哪个容器。

                data必须写成函数:避免组件被复用时,数据存在引用关系。

                (使用template可以配置组件结构)

  • 二、如何注册组件

        局部注册:靠new Vue的时候传入components选项

        全局注册:通过Vue.component(“组件名”,组件)

  • 三、编写组件标签:<school></school>

Vue中使用组件的三大注意点:

  • 一、关于组件名:

        一个单词组成:

                第一种写法(首字母小写):school

                第二种写法(首字母大写):School

        多个单词组成:

                第一种写法(-连字符):my-school

                第二种写法(驼峰):MySchool(需要脚手架支持)

        备注:

                组件名尽可能回避HTML中已有的元素名称。

                可以使用name配置项指定组件在开发者工具中呈现的名字。

  • 关于组件标签

        第一种写法:<school></school>

        第二种写法:<school/>

        不用使用脚手架时,<school/>会导致后续组件不能渲染。       

  • 一个简写方式:

         const school = Vue.extend(options) 可简写为:const school = options。

关于VueComponent

 一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype。

脚手架

脚手架文件结构

    ├── node_modules 
    ├── public
    │   ├── favicon.ico: 页签图标
    │   └── index.html: 主页面
    ├── src
    │   ├── assets: 存放静态资源
    │   │   └── logo.png
    │   │── component: 存放组件
    │   │   └── HelloWorld.vue
    │   │── App.vue: 汇总所有组件
    │   │── main.js: 入口文件
    ├── .gitignore: git版本管制忽略的配置
    ├── babel.config.js: babel的配置文件
    ├── package.json: 应用包配置文件 
    ├── README.md: 应用描述文件
    ├── package-lock.json:包版本控制文件

关于不同版本的Vue

  • Vue.js与Vue.runtime.xxx.js的区别:

        1、Vue.js是完整版的Vue,包含:核心功能+模板解析器。

        2、Vue.runtime.xxx.js是运行版的VUe,只包含:核心功能;没有模板解析器。

  • 因为Vue.runtine.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接受到的createElement函数去指定具体内容。

Vue.config.js配置文件

  • 使用vue inspect>output.js可以查看到Vue脚手架的默认配置。
  • 使用Vue.config.js可以对脚手架进行个性化定制。

ref属性

  • 被用来给元素或子组件注册引用信息(id的替代者)。
  • 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)。
  • 使用方法:

        1、标签中:```<h1 ref="xxx">.....</h1>``` 或 ```<School ref="xxx"></School>```。

        2、获取:this.$refs.xxx

props配置项

  • 功能:让组件接受外部传来的数据。
  • 传递数据:<Demo name="xxx"/>
  • 接收数据:

        1、第一种方式(只接收):props:["name"]

        2、第二种方式(限制类型):props:{name:String}

        3、第三种方式(限制类型、限制必要性、指定默认值):                                                     

 (props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求却是需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。)。

minin(混入)

  • 功能:可以把多个组件共用的配置提取到一个混入对象。
  • 使用方法:

        1、定义混入:

        2、使用混入:

插件

  • 功能:用于增强Vue。
  • 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
  • 定义插件

        对象.install=function(vue,options){

                添加全局过滤器

                Vue.filter(...)

                添加全局指令

                Vue.directive(...)

                配置全局混入

                Vue.mixin(...)

                添加实例方法

                Vue.prototype.$myMethod=function(){...}

                Vue.protoytpe.$myProperty=xxxx

        } 

  • 使用插件:Vue.ues()

scoped样式

  • 作用:让样式在局部生效,防止冲突。
  • 写法:<style scoped>。

全局事件总线

  • 一种组件间通信的方式,适用于任意组件间通信。
  • 安装全局事件总线

        new Vue({

                beforeCreate(){

                        Vue.prototype.$bus=this($bus就是当前应用的vm)

                }

        })

  • 使用事件总线

        1、接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。

                methods(){ demo(data){......} }

                mounted(){ this.$bus.$on("xxxx",this.demo) }

        2、提供数据:this.$bus.$emit("xxxx",数据)

  • 最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。

消息的订阅与发布

  • 一种组件间通信的方式,适用于任意组件间通信。
  • 使用步骤:

nextTick

  • 语法:this.¥nextTick(回调函数)
  • 作用:在下次DOM更新结束后执行其指定的回调。
  • 适用情况:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数汇总执行。

Vue的过渡与动画

  • 作用:在插入、更新或移除DOM元素后,在合适的时候给元素添加样式类名。
  • 写法:

        1、准备样式:

                元素进入的样式:

                v-enter:进入的起点

                v-enter-active:进入过程中

                v-enter-to:进入的终点

                元素离开的样式:

                v-leave:离开的起点

                v-leave-active:离开过程中

                v-leave-to:离开的终点

        2、使用transition包裹要过度的元素,并配置name属性:

                

         3、若有多个元素需要过度,则需要使用:<transition-group>,且每个元素都要key值

  •  vue脚手架配置代理:

 

插槽

  • 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用与父组件给子组件传递数据。
  • 使用方法:

         

        

Vuex

概念

        在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

        多个组件需要共享数据时使用。

搭建Vuex环境

  • 创建文件

        1、创建文件:src/store/index.js

        2、引入Vue核心库:import Vue from "vue"

        3、引入Vuex:import Vuex from “vuex”

        4、使用Vuex:Vue.use(Vuex)

         

        创建actions对象——响应组件中用户的动作。const actions={}

        准备mutations对象——修改state中的数据。const mutations={}

        准备state对象——保存具体的数据。const state={}

        创建并暴露store

  • 在main.js中创建vm时传入“store” 配置项

        引入store:import store from “./store”

        创建vm

基本使用

        1、初始化数据、配置“actions”、配置“mutations”,操作文件“store.js”

             引入Vue核心库,引入Vuex,使用Vuex。(同上)

   const actions = {
       //响应组件中加的动作
   	jia(context,value){
   		// console.log('actions中的jia被调用了',miniStore,value)
   		context.commit('JIA',value)
   	},
   }
   
   const mutations = {
       //执行加
   	JIA(state,value){
   		// console.log('mutations中的JIA被调用了',state,value)
   		state.sum += value
   	}
   }
   
   //初始化数据
   const state = {
      sum:0
   }
   
   //创建并暴露store
   export default new Vuex.Store({
   	actions,
   	mutations,
   	state,
   })

        2、组件中读取vuex中的数据:$store.state.sum

        3、组件中修改vuex中的数据:$store.dispatch("action中的方法名",数据)或&store.commit("mutations的方法名",数据)

        (若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit)。

getters的使用

        1、概念:当state中的数据需要经过加工后再使用时们可以使用getters加工

        2、在store.js中追加getters配置。

        

         3、组件中读取数据的方法:$store.getters.biigSum

四个map方法的使用

        mapState方法:用于帮助我们映射“state”中的数据作为计算属性。

        

        mapGetters方法:用于帮助我们映射“getters”中的数据作为计算属性。

        

        mapActions方法:用于帮助我们生成与actions对话的方法,即包含$store.dispatch(xxx) 的函数

        

        mapMutations方法:用于帮助我们生成与“mutations”对话的方法,即包含$store.commite(xxx)的函数

         

模块化与命名空间

目的:让代码更好维护,让多种数据分类更加明确。

修改store.js:

const countAbout = {
     namespaced:true,//开启命名空间
     state:{x:1},
     mutations: { ... },
     actions: { ... },
     getters: {
       bigSum(state){
          return state.sum * 10
       }
     }
   }
   
   const personAbout = {
     namespaced:true,//开启命名空间
     state:{ ... },
     mutations: { ... },
     actions: { ... }
   }
   
   const store = new Vuex.Store({
     modules: {
       countAbout,
       personAbout
     }
   })

路由vue-router

理解:一个路由就是一组映射关系,多个路由需要路由器(router)进行管理。

前端路由:key是路径,value是组件

基本使用

        安装vue-router,命令:npm i vue-router.

        使用插件 Vue.use(VueRouter)

        编写router配置项:

                引入VueRouter:import VueRouter from “vue-router”

                引入需要路由的组件:import 组件命名 from “文件路径”

                创建router实例,去管理一组组的路由规则:

                

                暴露router:export default router。

        实现切换(active-class=“active”可配置高亮样式):

                 <router-link active-class="active" to="/about">About</router-link>

        指定展示位置:<router-view></router-view>

注意点:

        路由组件通常存放在“pages”文件夹,一般组件通常放在“components”文件夹中。

        通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。

        每个组件都有自己的$route属性,里面存储这自己的路由信息。

        整个应用只有一个router,可以通过组件的$router属性获取到。

多级路由

        配置子路由规则,使用children配置项:

 routes:[
   	{
   		path:'/about',
   		component:About,
   	},
   	{
   		path:'/home',
   		component:Home,
   		children:[ //通过children配置子级路由
   			{
   				path:'news', //此处一定不要写:/news
   				component:News
   			},
   			{
   				path:'message',//此处一定不要写:/message
   				component:Message
   			}
   		]
   	}
   ]

        跳转(要写完整路径):<router-link to="/home/news">News</router-link>

路由的query参数

        传递参数

        

        接受参数:{{$route.query.id}} {{$route.query.title}}

命名路由

作用:可以简化路由的跳转。

使用:

        1、给路由命名

        

        2、简化跳转。

        简化前: <router-link to="/demo/test/welcome">跳转</router-link>

        简化后:<router-link :to="{name:'hello'}">跳转</router-link>

        简化写法配合传递参数:

路由的params参数

配置路由,声明接受params参数。

path:'/home',
   	component:Home,
   	children:[
   		{
   			path:'news',
   			component:News
   		},
   		{
   			component:Message,
   			children:[
   				{
   					name:'xiangqing',
   					path:'detail/:id/:title', //使用占位符声明接收params参数
   					component:Detail
   				}
   			]
   		}
   	]

 传递参数

        跳转并携带params参数,to的字符串写法:

                <router-link :to="/home/message/detail/666/你好">跳转</router-link>

        跳转并携带params参数,to的对象写法:

                

(路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name)

接收参数:$route.params.id  $route.params.title

路由的props配置

作用:让路由组件更方便地收到参数

router-link的repalce属性

作用:控制路由跳转时操作浏览器历史记录的模式。

浏览器的历史记录有两种写入方式:分别为push和repalce,push是追加历史记录,repalce是替换当前记录,路由跳转时默认为push。

使用方法:<router-link replace .......>News</router-link>

编程式路由导航

作用:不借助<router-link>实现路由跳转,让跳转更加灵活。

具体编码:

缓存路由组件(keep-alive)

作用:让不展示的路由组件保持挂载,不被销毁。

具体编码:

两个新的生命周期钩子

作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。

具体名字:

        activated:路由组件被激活时触发。

        deactivated:路由组件失活时触发。

路由守卫

作用:对路由进行权限控制。

分类:全局守卫、独享守卫、组件内守卫

全局守卫:

独享守卫:

组件内守卫:

路由器的两种工作模式:hash和history

对于一个url来说,什么是hash值:#及其后面的内容就是hash值。

hash值不会包含在http请求中,即hash值不会带给服务器。

hash模式:

        地址中永远带着#号,不美观。

        若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。

        兼容性较好。

history模式:

        地址干净、美观。

        兼容性和hash模式相比略差。

        应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。

      

Vue3

Vue3简介

vue3提供了更好的性能,更小的捆绑体积、更好的typescript集成、用于处理大规模用例的信API。

优势:

        加入了typescript的支持。

        3.0没有beforeCreate created,用setup取代。

        单独功能可以抽离封装,watch,component。

        比vue2速度更快。

        没有眼花缭乱的this。

        强大的Proxy实现响应式。

核心用法

api都需要按需引入

setup

        setup函数是众多api的入口

        setup是启动页面后会自动执行的一个函数

        项目中定义的所有变量、方法都需要在setup中。

        定义的变量和方法都需要return出去

ref方法

        ref为值创建了一个响应式引用。

        当ref里的值发生改变时,视图层就会自动更新

        ref可操作性基本数据类型和复杂数据类型。

        建议ref用来做操数字和字符串类的数据。

        用.value取值

reactive方法

        reactive是将复杂数据类型(数组、对象)变成响应式。

        可响应深层次的数据,比如多维数组。

        reactive返回一个响应式的proxy对象。

toRefs方法

        用于将批量设置多个数据为响应式数据。

        toRefs与原始数据有交互,修改响应式数据会影响到原数据,但不会更新视图层

        toRefs还可以与其他响应式函数交互,更多方便处理视图层数据。

        用.value取值,return用扩展运算符

计算属性computed

        计算属性与vue2一致,用来计算新的变量,但需要按需引入。

        要写在setup里。

 监听属性watch

        与vue2一致,用来监听数据变化,需要按需引入

        同上:

 watchEffect侦听器

        watchEffect如果存在,在组件初始化时就会执行一次。

        watch可以获取到新值和旧值,而watchEffect是拿不到的。

        watchEffect不需要指定监听的属性,可以自动收集依赖(前提是回调中应用到了响应式的变量属性),那么属性变化时,这个侦听器就会执行,而watch是一对一。

        

 shallowRef和shallowReactive

        shallowRef只处理基本数据类型

        shallowReactive只处理第一层数据

组件间传值(父给子)

        第一种:进入页面即刻传值

                祖传:provide('p',p1)

                孙收:const res=inject('p')

        第二种:父给子,点击传值

                <chilid ref='val'>引入子组件

               

 Vuex

        同vue2一致,但需要按需引入。import {useStore} from "vuex"

生命周期函数

        beforecreate

        created

        BeforeMount——在挂载开始之前被调用

        Mounted——组件挂载时调用

        BeforeUpdate——数据更新时调用

        Updated——数据更新导致的UNIdom重新渲染,调用该钩子

        BeforeUnmount——在卸载组件实例之前调用

        Unmounted——卸载组件实例后调用

        ErrorCaptured——当捕获一个来自子孙组件的错误时调用

Vue程序中4个主要事件

        创建——在组件创建时执行

        挂载——DOM被挂载时执行

        更新——当响应数据被修改时执行

        销毁——当元素被销毁之前立即运行。

抽离封装

        任何一个组合式api都可以单独抽离出去在另一个文件中,最后只需要引入并回归到setup()中即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值