VUE2 - 基础知识

265 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是VUE?

渐进式(学一点就能用一点)javascript框架,有一套自己的语法规则

VUE指令

插值表达式

不操作DOM了,需要什么直接把标签填进去

定义:

export default {
  data() { 
    // 格式固定, 定义vue数据之处
    return {  // key相当于变量名
      msg: "hello, vue",
      obj: {
        name: "小vue",
        age: 5
      },
    }
  }
}

使用 : {{表达式}}

MVVM设计模式

概念 : MVVM 通过数据双向绑定让数据自动同步 不需要操作DOM

M : modle数据模型(data里定义)

V : view视图(html页面)

VM : ViewModle视图模型(vue.js源码)

v-bind

作用 : 这只标签行内属性(标准属性 自定义属性)的值

语法 : v-bind:属性名 = "vue变量名"

简写 : :属性名 = "vue变量名"

v-on
  • 基本

作用 : 给标签绑定事件

语法 : v-on:事件类型="执行函数名"

简写 : @事件类型="执行函数名"

  • 参数及事件对象

语法 : 无传参, 通过形参直接接收

​ 传参, 通过$event指代事件对象传给事件处理函数

​ 既要传参又要事件对象, fn(实参,$event)

  • this

this:当前组件对象 万物皆对象 组件也看成是对象

  • 事件修饰符

.stop - 阻止事件冒泡

.prevent - 阻止默认行为

.once - 程序运行期间,只触发一次事件处理函数

  • 按键修饰符

vue封装的方法,背后是 : 事件对象.keyCode 进行判断

v-model
  • 基本

作用 : 能体现VUE双向数据绑定

语法 : v-model="vue数据变量名" 表单元素

  • 修饰符
v-text和v-html

语法 : v-text / html="vue数据变量名"

v-show和v-if

原理 : v-show -> 隐藏 / 显示 v-if -> 移除 / 创建

语法 : v-show / if = "vue数据变量名"

v-for

语法 : v-for="(值,索引) in 目标结构" v-for="值 in 目标结构"

目标对象 : 可遍历数组 / 对象 / 数字 / 字符串(可遍历结构)

注意 : v-for的临时变量名不能用到v-for范围外

vue操作样式

操作类名
  • 基本用法

语法::class="{属性值就是定义好的类名:boolean类型的变量值,属性值就是定义好的类名:boolean类型的变量值,......}"

  • 其他用法

语法::class="变量名"

​ 变量是值:字符串直接作为类名

​ 变量是数组:数组内所有成员字符串直接作为类名

操作style

语法::style="{css属性名:变量,css属性名:变量......}"

​ 变量是css属性值

过滤器

语法:filters:{过滤器名字:function(形参){return "返回处理后的值"}}

过滤器传参:vue变量 | 过滤器(实参)

多个过滤器:vue变量 | 过滤器1 | 过滤器2

场景:只能用在插值表达式和v-bind表达式

计算属性

语法:computed:{

​ “计算属性名”:{

​ set(形参){},

​ get(){

​ return “值”

​ }

​ }

优势:基于他们依赖项的值结果进行缓存的,只要依赖的先变量不变,都直接从缓存取结果

侦听器

语法:

watch:{

    被监听数据名:{

        handler(newVal,oldVal){

            代码     

        },

        deep:true//深度监听

        immediate:true  //马上让handler执行一次

    }

}

作用:检测数据是否发生变化

优点:减少代码量

组件

语法:创建 : 组件文件夹 components/XXX.vue

​ 导入 : import 变量名 from "路径"

​ 注册 : components:{自定义名:导入变量名}

​ 使用 : <自定义名></自定义名> / <自定义名/>

作用:减少重复代码,利于维护

scoped

目的:解决多个组件样式名相同冲突问题

语法:子组件style标签上加上scoped

组件通信

父:使用其他组件的VUE文件

子:被引入的组件(嵌入)

原因:简单数据类型更改数据,会导致子和父的数据会不一致

1.父传子 -> props

2.子传父 -> $emit

Event Bus

目的:解决任何组件之间的通信(不局限在父子关系)

理解:构建高速公路 事件总线

语法:Event Bus

let bus = new Vue()

Vue.prototype

生命周期

概念:特定时间点创建特定函数

阶段:

1.初始化阶段:组件打开时,对初始化数据做个处理

  • beforeCreate(){}

节点:数据初始化数据是否挂载到vue实例化对象上

  • created(){}

2.挂载阶段:读取template模板(内部html结构)

  • beforeMount(){}

节点:看内存中虚拟dom是否真实渲染到页面上

  • mounted(){}

业务场景:获取后台数据后,渲染在页面中的时候

3.更新阶段:data中的值被改变

  • beforeUpdate(){}

节点:数据更新时,新旧虚拟dom对比前后结果,打补丁到真实dom节点上

  • updated(){}

4.销毁阶段:

  • beforeDestroy(){}

节点:卸载vue组件对象

  • destroyed(){}

axios

使用:1.下载 2.导入 3.写在mounted/created里面(获取、查询、发布)

$refs

作用:获取dom元素

基本使用:1.给标签写个标识:ref=“自定义id值”

​ 2.获取 this.$refs.自定义id值

​ 3.写在mounted中

获取组件对象:

场景:父组件内使用子组件的对象(数据)

使用:1.给标签写个标识:ref=“自定义id值”

​ 2.获取 this.$refs.自定义id值

​ 3.写在mounted中且父组件可修改子组件数据

$nextTick

作用:子组件的数据this.a的方法父组件不能使用 是两个作用域

动态组件

概念:多个组件使用同一个挂载点,并动态切换

  • 基本使用:

1.创建要被切换的组件 - 标签+样式

2.引入到要展示的vue文件内, 注册

3.变量-承载要显示的组件名

4.设置挂载点

5.点击按钮-切换comName的值为要显示的组件名

场景:同一个挂载点要切换 不同组件 显示

  • 组件缓存

目的:组件切换会导致组件被频繁销毁和重新创建, 性能不高;keep-alive组件, 可以让包裹的组件保存在内存中不被销毁

用法:

<keep-alive>

	<component :is="组件名"></component>

</keep-alive>
  • 补充生命周期

activated - 激活

deactivated - 失去激活状态

插槽

概念:一个组件有两处以上需要传入标签的地方

1.基本使用: 子组件-->

​ 父组件-->标签里面直接改内容

2.具名插槽:

​ 子组件:在slot标签上绑定属性name="自定义变量名"和默认值

​ 父组件:在template标签中绑定v-slot="自定义变量名"

3.作用域插槽:

​ 子组件:<slot :自定义名="要抛出的数据">

​ 父组件:v-slot="父组件随便起个变量名" 里面存放的是子组件对象

自定义指令

概念:除了核心功能默认内置的指令 (v-model 和 v-show...),Vue 也允许注册自定义指令。 v-xxx

局部注册:1.标签上v-自定义名

​ 2.directives:{自定义名:{inserted(el){功能}}}

全局注册:1.写在main.js中

​ 2.Vue.directives('自定义名',{inserted(el){功能}})

路由

1.概念:设备和ip一一对应的关系

2.优点:

​ 整体不刷新页面,用户体验更好

​ 数据传递容易, 开发效率高

​ 地址栏 输入#哈希值 后面无论输入什么数据,页面都不会刷新

3.基本使用:

​ 1.下载:yarn add vue-router

​ 2.配置:

import VueRouter from 'vue-router'
	Vue.use(VueRouter);
	import 自定义名 from '文件路径'
	let router = new VueRouter({
		routes:[
			{path:'/路由地址',
			component: 自定义名}
		]
	})

​ 3.app.vue中

       <router-link to="path中的路由地址"></router-link>

4.传参:

​ 4.1.修改路由:

​                   {path:'/路由地址/:id',
​                   component: 自定义名}
​                   id为自定义的名

​ 4.2.手动在地址栏添加要传递的参数 /my?id=111

​ 4.3.获取数据 当前组件接受这些数据 $route.query.id(或者其他)

5.重定向

场景1:网页默认打开, 匹配路由"/", 强制切换到"/find"上

语法:

	{
       path: "/", // 默认hash值路径
       redirect: "/find" // 重定向到/find
       // 浏览器url中#后的路径被改变成/find-重新匹配数组规则
     }

场景2:输入的是错误的值

语法:

{
	path: "*",
	component: NotFound
}

​ 先定义一个子组件表示找不到页面的显示,并且导入,名为NotFound

6.模式:

场景:地址不想显示#

语法:

const router = new VueRouter({
     routes:[],
     mode: "history" // 打包上线后需要后台支持, 模式是hash
})

7.编程式导航

​ 7.1定义

                {path:'/路由地址',
​                 name:'路由名'component: 自定义名}

​ 7.2使用

                this.$router.push({
​                path: "路由路径", // 都去 router/index.js定义name: "路由名"})

​ 7.3点击跳转 @click="goto"

goto(){
​                   this.$router.push({
​                   name: "My"
​                  });
​                }

​ 7.4跳转传参

​ query官方:

this.$router.push({
​                  path: "/one",
​                  query:{ id:id,  // 参数名:形参},
​               });

​ params官方(必须用name):

this.$router.push({
​                 name:"one",   
​                 params:{id:id}
​               });

8.嵌套

场景:二级路由

语法:

{
​       path: "/find",
​       name: "Find",
​       component: Find,
​       children: [
​         { path: "recommend",
​           component: Recommend},
​       ]
​     }
​    <router-link to="/find/recommend">推荐</router-link>

9.自带类名:

router-link自带的2个类名:

1.router-link-exact-active (精确匹配) url中hash值路径, 与href属性值完全相同, 设置此类名

2.router-link-active (模糊匹配) url中hash值, 包含href属性值这个路径

10.守卫

场景:在跳转路由前, 判断用户登陆了才能去<我的音乐>页面, 未登录弹窗提示回到发现音乐页面

语法: router.beforeEach((to, from, next)=>{//路由跳转"之前"先执行这里, 决定是否跳转})

​ 参数1: 要跳转到的路由 (路由对象信息) 目标

​ 参数2: 从哪里跳转的路由 (路由对象信息) 来源

​ 参数3: 函数体 - next()才会让路由正常的跳转切换, next(false)在原地停留, next("强制修改到另一个路由路径上")

​ 注意: 如果不调用next, 页面留在原地

vant

简介: vant是一个轻量、可靠的移动端 Vue 组件库, 开箱即用

使用:

1.下载:yarn add vant -D

2.导入:

​ 2.1全部导入

import Vant from 'vant';
​           import 'vant/lib/index.css';
​           Vue.use(Vant);

​ 2.2手动按需引入

import Button from 'vant/lib/button'; // button组件import 'vant/lib/button/style'; // button样式components: { // 手动注册组件名

​ }

​ 2.3自动按需引入

​ 下载:yarn add babel-plugin-import

​             babel.config.js:
​                module.exports = {
​                    plugins: [
​                        ['import', {
​                          libraryName: 'vant',
​                          libraryDirectory: 'es',
​                          style: true
​                          }, 'vant']
​                        ]
​                 };