Vue基础
设计模式 mvvm

m: model 数据 界面中展示的或应用中使用的数据

v: view 视图 用户看到的界面

vm: view-model 中间人 处理数据与界面之间的相关逻辑(处理v和m的交互)

new Vue得到一个vue对象 后续的数据管理和视图的渲染更新这些操作都是通过这个Vue对象来完成的

初始化Vue中的属性
el:指定当前vue对象处理的范围,通过el指定的内容将被当前Vue对象管理,

可使用选择器指定,要在这个范围内才能管理和使用data的数据

data:存放当前Vue实例管理的应用中的所有数据

模板语法

插值语法 双花括号-插值**表达式**-双花括号 Mustache写法双大括号

表达式:能产生结果(值)的公式 ==变量|函数调用|数学运算==等

语句: 一个行为,例如if for之类

双花括号-val-双花括号 如果val是对象 vue会默认将val转为JSON格式

相当于双花括号-JSON.stringfy(val)-双花括号

vue指令

指令填充的是表达式

v-开头的一种特殊属性 行间 vue内置了很多指令 我们还可以自定义指令

v-for = “(val,idx) in array”

v-show是改变display属性(存在于页面上) 需要频繁切换时使用

v-if是是否渲染元素(不满足时这个元素直接不存在)

v-text和v-html

v-text=”title” 这个title代表的是变量(表达式) 是data中title的值

如果想要title字符串 可以写为 v-text=“‘title’”

v-html更新元素的innerHTML 危险 容易导致xss攻击 可以识别html语法

v-html=“content” //data中content=“\<strong>I am strong\</strong>

v-text相当于更新元素的innerText 纯文本

v-bind

想把数据作为标签的某个特定属性

把表达式的值绑定到指定的参数属性中

v-bind:value=“title” //title是表达式 是data中定义的变量

==简写形式== 只有冒号 去掉v-bind

:value=“title”

当想传入一个对象而不是字符串时,用v-bind写法

:value = “{title:‘super’}”

针对class和style使用v-bind时又有特殊用法

v-bind动态改变class 使用三目运算符

或用对象写法 作用等同三目

对于class和style还有特殊待遇,可用数组形式和对象形式

v-bind:

v-bind:class=“[class1,class2,class3]”

v-bind:style=“{color:activeColor,background:bgColor}”

或“[colorObject,bgObject]” colorObject和bgObject是定义在data中的对象

v-on

v-on:click= 简写 @click=

vue中的click相当于js中的onclick 后面跟函数名 不带() 与原生html的onclick(带括号)区分

vue中的函数默认都指向当前vue对象

原因是在函数中用this可以很方便的去调用vue实例对象下的其他数据,例如data中的数据

data中的数据和methods中的函数,都可以通过实例对象进行直接访问

Vue在初始化时把data、methods中的属性和方法都直接挂载到了实例对象上

把data中的methods中的数据直接挂在了实例对象上

this.dataProp1(不用this.data.dataProp1)

this.methodFn1()(不用this.methods.methodFn1())

想拿到事件元素event怎么拿?通过第一个参数

methods中的方法的第一个参数就是事件对象

==特殊地==

v-on:click=“fn4()” 并不会立即调用 vue会智能地判断 还是会等到点击时才触发

如果在v-on处用了带括号的写法,必须显式地声明事件参数 否则不会获取到事件对象

v-on:click=“fn4($event)”

假设Vue对象中methods:function click(p1,p2){console.log(p1,p2)};

v-on不同写法有以下几种情况:顺序很重要

  • v-on:click=‘click’ 这时会自动将第一个参数视为事件对象 //MouseEvent{} undefined
  • v-on:click=‘click(1)’ 这时就没事件对象啥事了 当做正常参数了 //1 undefined
  • v-on:click=‘click($event)’ 显示调事件参数 //MouseEvent{} undefined
  • v-on:click=‘click(1,$event) 两个参数都生效 //1 MouseEvent{}

==事件修饰符== 不同指令有不同修饰符 有的指令无修饰符

@click.修饰符=“函数名” 也可以不跟函数 只是触发事件修饰符

@contextmenu.prevent 阻止右键弹出菜单的默认行为

stop 阻止冒泡 相当于stopPropagation()

capture 捕获 相当于把原生addEventListener中第三个参数设置为true 事件设为捕获

prevent 阻止默认行为

once 绑定一次

self 只有点自己才会触发

passive(消极的) true表示永不调用preventDefault 为false即可以preventDefault

self:给父亲设置@click.self后,点击儿子是不会触发父亲方法的(没设置之前是可以触发的)

v-model 双向绑定

简单滴说:

双向绑定 = 单向绑定 + UI 事件监听

例子:

http://js.jirengu.com/duzo/1/edit?html,console,output

表单💡

数据单向绑定(v-bind) model -> view

当js中的数据变化了,视图上显示的数据也会重新渲染

数据双向绑定(v-model) model <-> view

当js中的数据变化,视图上的数据也会变化

当视图的数据发生变化,js中的数据也发生变化

不同的标签 v-model绑定的标签属性不一样 智能地绑

input:text v-model 绑定的是value

input:checkbox v-model 绑定的是checked

input:radio v-model 绑定的是checked

input单个checkbox v-model 绑定checked 布尔值

input多个checkbox v-model绑定数组 value出现在了数组中则被选中

input多个radio v-model绑定字符串 哪个radio被选中 就显示哪个radio的value值

select多个option v-model绑定字符串 哪个option被选中 就显示哪个option的innerText(文本内容)

.lazy修饰符 input变化时不会实时更新 而是失去焦点时再更新

.number 用户输入的值转为数值类型(原本默认为string)

.trim 去除首尾空白字符

自定义指令

指令是以属性方式出现在元素上的,有特殊前缀,v-指令名称

指令时作用于 使用当前指令的元素上的 当一个元素使用某个指令以后 该指令会对当前使用它的元素产生一些特定效果 具体的效果由当前指令的具体代码去实现

Vue.directive(id,[definition]) 方法定义全局指令

id:指令名称 使用时需要带v-前缀,定义时不用带v-前缀

defnition:指令定义 具体定义、指令配置

钩子函数:指令的执行过程中不同阶段调用的不同函数

==5个钩子==: bind inserted update componentUpdated unbind

https://cn.vuejs.org/v2/guide/custom-directive.html

注意💡 bind函数只执行一次,在初始化时指令绑定到元素上的瞬间执行,即使值再改 不会重新绑定的

第一次绑定并不算update 一般大逻辑写在bind中 update改变小值

如果bind函数和update函数想共享变量 可以把变量挂载这些函数的第一个参数上(即dom元素对象)

或者通过dataset来共享数据

bind函数的第一个参数为元素 第二个参数binding为对象 里头有一些属性

根据binding来配置自定义指令的值

如果想自动重新绑定类似v-model那样 就不用bind函数钩子 用update钩子

focus不生效的原因:

focus不能放在bind和update中,要放在inserted狗子中

bind vue还没解析完

data中的数据

data中一般放原始数据

派生数据一般放 computed中 是通过计算或其他值换算来的

计算属性 会动态地受其他值影响 其他值变了 它动态地改变 很智能

==注意==

computed对象中为方法,返回计算后的结果

对应的html中双花括号--双花括号中的数据为方法名

html:

\<p>双花括号-methodA-双花括号\</p>

js:

data:{message:‘hello’}

computed: {

methodA: return this.message.substr(1)

}

如果用v-model绑定了数据 computed方法中必须配上get()和set()

因为v-model是双向绑定 用户也可能改数据 导致computed属性发生改变

如果是v-bind就说明只是读取值 不会改值 就不用写get()和set() 默认为get()

直接return xxxxx

注💡

一般来说 computed属性都是派生来的 由其他属性计算得来的 而不是直接手动改

侦听器

watch

监听的属性名要与data中的数据同名

watch:{

​ a(){ //a为data中的属性}

}

当有的数据 是异步变化而不是立即得到结果的可能要用到监听watch

vue-router 前端路由

注💡 页面切换的请求千万不要让浏览器发请求(这样会让浏览器来渲染了)

要让vue来渲染

模式 url的# hash是不会导致页面刷新发请求的

单页面SPA和多页面MPA SPA通过#hash 后端通过x1.html/x2.html

https://juejin.im/post/5a0ea4ec6fb9a0450407725c

历史记录方式要处理比较多情况 比如判断别人是浏览器直接打开访问的 比如 localhost/a

可能要加个header 然后判断方式不是ajax时

可能还需要后端支持

因为不带hash了 所以可能需要后端路由

可以局部刷新 局部渲染 用户体验比较流程

Author: superman285
Link: https://skr.dog/2019/01/04/Vue基础/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.