MVVM
- M Model:数据模型层 (数据)
- V View :视图层 (页面 DOM)
- VM ViewModel:负责监控视图层和数据模型层的数据,并对应的通知另一侧进行修改(监控者)
Vue
Vue 是一套用于构建用户界面的渐进式框架,使用 vue 必须先引入
1 | <div class="box"> |
Vue 的模板语法
v-bind
将 data 中的数据绑定到 html 元素的
属性
上
1 | <p class="pic"> |
v-if
v-if 用于控制 html 元素是否创建
1 | <div id="app"> |
v-show
v-show 用于控制 html 元素是隐藏还是显示
1 | <div id="app"> |
v-for
用于遍历数组或者对象
1 | <div id="app"> |
v-on
vue 中的点击事件
1 | <div id="app"> |
v-model
数据双向绑定 v-model
v-model.lazy:延迟视图更新,当按下回车键或者输入框失去焦点,视频是更新。不会随着输入框的内容同步更新。
1 | <div class="box"> |
数据检测更新
动态添加一个对象的属性时并不会触发视图变化(没有被监听)
可以通过 Vue.set(对象,属性名,值)
和 this.$set(对象,属性名,值)
1 | <div id="app"> |
事件修饰符
事件修饰符可以连写
- .stop 阻止事件冒泡
1 | <div @click="console.log('div')"> |
- .prevent 阻止默认事件
1 | <a href="" @click.prevent="show">查看头相</a> |
- .once 事件绑定一次
1 | <a href="javascript:;" @click.once.stop="show">只能查看一次头相</a> |
##计算属性
计算属性放在
computed
里面计算属性名是一个方法,该方法必须要返回一个值
1 | <box id="app"> |
watch
监听
组件 component
在使用组件时,多个单词的名字,要用横线链接。
必须先写组件,再创建 Vue 实例
template 里面写的是 html 模板,它只能包含一个 html 根元素
在组建中的 data 必须是一个函数,并且返回一个对象,这样设计的模式是保证每一个组件之间都是各自独立的,互不影响的。
props 属性值是不能被修改的(单向数据流)
创建全局组件
1 | Vue.component('组件名',组件的配置对象) |
属性验证
1 | props:{ |
通信
父传子
父组件
1
2
3
4
5<template id="parent">
<div>
<child :message="msg"></child>
</div>
</template>子组件
在子组件的props中可以拿到父组件传递过来的值
1
2
3
4
5
6
7
8数据写法:
props:['message']
对象写法:
props:{
message:{
type:Object
}
}
子传父
实现方法是父组件自定义一个事件,在子组件中$emit(‘父组件中自定义的事件名’,需要传递的值)
1 | + 子组件 |
非父子组件通信
主要实现方法是定义一个公共vue实例文件bus.js作为中间媒介进行传值
1 | //bus.js |
Vue实例生命周期
销毁组件或者Vue实例
1 | # 绑定事件,然后在事件上调用clear方法 |
8个事件钩子
- beforeCreate( )
- created( ) —–能拿到实例中的data数据,在这一步即可进行ajxa请求数据
- beforeMount( ) —-可以拿到元素,但是元素里面的数据未被解析渲染
- mounted( )—-操作DOM元素的地方,echarts应用在Vue中,Swiper
- beforeUpdate( )
- updated( )
- beforeDestroy( )
- destroyed( )
Vue组件的生命周期
- beforeCreate( )
- created( ) —–可以拿到props属性的值
- beforeMount( ) —-在组件中此方法拿不到DOM元素
- mounted( )—-与Vue实例的生命周期不同,组建中需要到这一步才能拿到Dom元素
- beforeUpdate( )
- updated( )—–不建议在update中修改data的数据,会导致页面又重新渲染。可以选择在beforeUpdate或者watch中修改
- beforeDestroy( )
- destroyed( )
axios
axios是一个ajax请求的框架
get方式:axios.get( url ).then( ).catch( )
post方式:axios.post( url , data ).then( ).catch( )
- HTML
1 | <div id="app"> |
- JavaScript
1 | <script> |
- axios统一处理请求或响应
统一集中处理接口传入相同参数的设置以及统计处理错误码的设置
1 | // 设置请求的根路径 |
ref属性
$refs–通过它可以获取到html元素或者组件,
this.$refs.html标签的ref属性值 —获取到对应的dom元素
循环出来的元素上加了ref属性时,通过this.$refs.ref值是可以全部获取的(获取出来的是个数组)
过滤器
- 全局自定义过滤器
1 | # 定义 |
- 局部过滤器
1 | // 在组件的选项中定义 |
自定义指令
除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令,有时候需要对普通DOM元素进行底层操作,这时候就会用到自定义指令。
- 注册全局指令
1 | Vue.directive('指令名',{ |
- 注册局部指令
1 | // 在组件的选项中定义 |
Vue-cli
- 全局安装vue-cli
1 | npm install @vue/cli -g |
- 新建一个项目
1 | # 在存放项目的地方打开终端 |
- 查询npm来源以及更改成淘宝镜像
1 | 查询:npm get registry |
- proxy代理配置
1 | // 在vue.config.js中添加以下代码 |
动态路由
在定义路由时路径中带有冒号的即是动态路由,例如路径是 /film/:id 为动态路由,通过this.$route.params.id 获取到相应的值。
子路由/嵌套路由
在路由里在嵌套子路由
1 | export default new Router({ |
编程式导航
1 | this.$router.push('路径' ) |
路由守卫
- 路由全局守卫 (全局前置守卫(全局拦截))
1 | const router = new VueRouter({ ... }) |
- 单个路由守卫 (单个拦截)
1 |
|
- 组件内部的路由守卫 (单个拦截)
1 | beforeRouteEnter (to, from, next) { |
监听路由
监听路由的变化,当路由发生变化时要执行的操作
1 | watch:{ |
路由懒加载
只有访问该组件对应的路径时,才将相对应的js文件打包。按需加载
1 | export default new Router({ |
Vuex
各组件之间的数据共享(改变共享数据是需要符合预设的规则才能被修改)
在一个组件中导出了多个方法,在导入的时候要加花括号
- state
1 | mapState是一个方法可以简便获取store中的state |
1 | import Vue from 'vue' |