Vue使用CDN
<script src="https://unpkg.com/vue/dist/vue.js"></script>
Vue对象的格式
<div id="root">加油,{{name}}</div>
// {{这里可以放表达式变量函数等}}
<script type="text/javascript">
//方式一 ,此处是el 和data的
// 创建vue对象 其中包含 el(某个元素) data(数据)
new Vue({
// # id选择器
// . class选择器
el:"#root",
data:{
name:"Will"
},
})
//方式二 使用组件的话data需要写成函数式
const v = new Vue({
data: function () {
return {
name: "Will",
url: "https://www.baidu.com"
}
},
})
v.$mount("#root")
//通过这种方法绑定对象
</script>
模板语法
插值语法
将vue的data插入到网页的显示内容中{{ name }}。
指令语法
将vue中的数据放到标签。
v-bind是单向绑定,即vue对象中data改变了页面中对应的值会改变,但是页面中值改变不会影响data的值。
v-model是双向绑定,即是某一方改变之后对应的数据不会变。v-model只能用于输入类的参数。
// 插值语法
<div id="root">加油,{{name}}<br>
//指令语法 v-bind:href 也可以简写为:href
<a v-bind:href="url">linkto</a>
<a :href="url">linkto</a>
//指令语法 v-model:value="xxx" 输入参数的属性名为value也可以简写为 v-model="xxx"
<input type="text "v-model:value="url">
<input type="text "v-model="url">
</div>
MVVM
model :模型(指数据)
view :视图
viewmodel:vue中的实例对象。
Object.defineProperty
释义
其作用是为一个对象增添属性,并且设置属性的可删除,可变化等属性,并且可以将属性值与其他的变量进行关联。如果直接将某个变量的值赋予到属性,那么之后该变量的值变化,对应的属性值是不会变化的,但是通过Object.defineProperty中的get 将变量值赋予到属性,变量值会映射到属性。
const v = new Vue({
// # id选择器
// . class选择器
data: function () {
return {
name: "Will",
url: "https://www.baidu.com"
}
},
})
v.$mount("#root")
let age = 22
let person = {
name: "will"
}
Object.defineProperty(v, "age", {
/*
指定三个参数,对象,属性名,属性值相关配置
value 直接指定值,enumerable 可遍历的默认为false
writable 是否可改变 默认为false 不能与get同用
configurable 是否可删除 默认为false
get() set(value) 方法 其中value是获取到的变化的值。
get:funtion(){} 简写为get()
*/
// value: 22,
// enumerable:true,
// writable:true,
// configurable:true,
get:function () {
//get(){ return xxx}
//值与变量绑定
return age
},
set(value){
console.log(value)
console.log("modify value")
//将变化的值在赋值给变量
age = value
}
})
console.log(person)
数据代理
数据代理:通过一个对象完成对另一个对象数据的读写。
在vue对象中,data的数据会在 vm的_data复制一份,然后vue对象中会生成对应的data中的key,
vue通过Object.definePropert添加对应的key,以及get/set完成对_data的数据操作,完成数据代理。
事件处理
鼠标事件
基础使用
网页中存在与用户交互,需要处理相关事件,并且处理函数中会默认有event(鼠标事件),但是如果对事件函数传入了参数,如果还需要使用event则 click($event,par1,par2...),使用$event。如果没有参数可以直接写@click。
事件中@xxx后面也可以写一些简单语句。
如代码中的
<body>
<div id="root">
<button v-on:click="click">美女荷官</button>
//也可以简写为@click
<button v-on:click="click($event,250)">美女荷官</button>
</div>
<script type="text/javascript">
const v = new Vue({
data: function () {
return {
name: "Will",
url: "https://www.baidu.com"
}
},
methods:{
click(event,number){
alert("666")
}
}
})
v.$mount("#root")
</script>
</body>
事件修饰符
<!-- 阻止单击事件继续传播,例如一个div里有一个button,同时给div button(设置stop)设置点击事件,因为有stop,就不会触发div的点击事件-->
<a @click.stop="doThis"></a>
<!-- 阻止默认行为,例如阻止a链接的跳转-->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 事件只触发一次-->
<button @click.once="click"></button>
<!-- 一个事件开始是从大div到小div的事件捕获,然后再是小div到大div的冒泡事件-->
<!-- 事件捕获,事件捕获先于冒泡发生,如下面的代码,点击button先调用div的click,再调用button的-->
<div class="div" @click.capture="click($event,99)">
<button @click="click($event,222)">美女荷官</button>
</div>
<!-- 当点击的对象是它自己的时候才触发,如下面情况,当点击div本身而不是button的时候才调用div的click‘-->
<!-- 点击button的target是button,而不是div-->
<div class="div" @click.self="click($event,99)">
<button @click.once="click($event,222)">美女荷官</button>
</div>
<!-- 先执行事件的默认行为,之后再进行对应的回调-->
<div class="div" @click.passive="click($event,99)">
</div>
<!-- 事件修饰符可以连用-->
<div class="div" @click.prevent.passive="click($event,99)">
</div>
键盘事件
键盘事件包括@keyup/@keydown,vue中给常用的按键取了别名,即这个键发生了事件,就会触发函数。
<!-- up/down/right/left -->
<input type="text" @keyup.up="keyup"><!-- 输入回车-->
<input @kyup.enter="enter">
<!-- backspace 或者delete -->
<input type="text" @keyup.delete="keyup">
<!-- up/down/right/left -->
<input type="text" @keyup.up="keyup">
<!-- esc-->
<input type="text" @keyup.esc="keyup">
<!-- space -->
<input type="text" @keyup.space="keyup">
<!-- tab 需要注意tab其功能是跳到下一个元素,使用keyup的时候已经是到下一个元素了,目标就成了一个元素-->
<!-- 而此时需要用keydown,-->
<!-- 与tab类似的还有shift,alt,ctrl,meta-->
<input type="text" @keyup.tab="keyup">
<!-- 想要查看其他键,可以直接将event.key(键名)和event.keyCode(键码) 去做判断 -->
keyup(event) {
console.log(event.key)
console.log(event.keyCode)
}
<!-- 键盘按键可以同用,例如下面tab和a同按触发-->
<input type="text" @keyup.tab.a="keyup">
计算属性
很多时候需要对vue中的属性进行计算或者组合,就可以使用vue中的计算属性,就可以将其设置在computed中写,写其中的get,然后再网页中像普通属性一样使用计算属性,set中注意的是修改之后要修改关联的属性。
如果不需要用set,那么就可以简写 key(){ return xxx }.
计算属性再使用第一次之后,会进行缓存,在一个网页使用N次,get方法只会调用一次,并且计算属性中关联到的属性在变化了之后调用get,使得计算属性的值也发生相应的变化。
show:{{ info}}
new Vue({
data: function () {
return {
name: "Will",
sex: "https://www.baidu.com"
}
},
computed:{
info:{
get(){
return this.name+this.sex
}
}
}
})
v.$mount("#root")
//简写
computed:{
info(){
return this,name+this.sex
}
}
侦听属性
基础使用
vue中的数据(包括普通data和计算属性)发生了变化,想要完成对属性的检测,则可以使用watch。
如果需要监视多级属性中的某个数据,例如student.name,想要单独监视它,key需要写为"student.name"。
const v = new Vue({
data: function () {
return {
name: "Will",
sex: "男"
}
},
computed: {
info() {
return this.name + this.sex
}
},
//直接在vue对象中配置watch,监视属性的变化
watch:{
name:{
deep:true,
handler(newValue,oldValue){
console.log(newValue)
console.log(oldValue)
}
}
},
})
v.$mount("#root")
// 在后面配置配置,传入参数为key,{ handler(){}}
v.$watch("sex", {handler(newValue, oldValue){
console.log(newValue)
console.log(oldValue)
//逻辑
}})
深度监视
一个数据含有多个层级的话,需要监视其中的属性的变化,在该数据的监视中配置一个deep:true,即可开启深度监测。
简写形式
如果不配置deep以及immediately,就可以采用下面的简写形式。
const v = new Vue({
data: function () {
return {
name: "Will",
sex: "男"
}
},
computed: {
info() {
return this.name + this.sex
}
},
watch:{
//简写
name(newValue,oldValue){
console.log(newValue)
console.log(oldValue)
}
},
})
v.$mount("#root")
//简写,后面传入个函数就行。
v.$watch("sex", function (newValue, oldValue){
console.log(newValue)
console.log(oldValue)
alert("sex changed")
})
对比计算属性和监视属性
监视属性和计算属性(配置一下set)都可以达到改变改变属性的目的。
计算属性中不能开启异步任务返回属性,因为异步任务需要将return写在那个setTiemeout,而这个setTimeout
的对象是windows,而不是vue对象,在其中写return value ,vue对象是拿不到值。
在监听属性中,直接改变其中的属性值,而不是返回给setTimeout的对象。
注意:有些函数式不被vue对象管理的,例如上面的setTiemeout以及ajax等。
样式绑定
有的时候需要在事件操作之后完成对网页样式的修改,此时就需要绑定样式。
使用:class,在事件回调中修改对应的属性就行,class的内容可以是单个样式,或者是样式的列表,如["div","root"],或者是一个字典里面配置true/false代表样式是否显示出来。
更换样式也可以使用标签style,用法类似,设置样式对象就行。
<div :class="xx">
new Vue({
data: function () {
return {
name: "Will",
sex: "https://www.baidu.com",
//样式为普通的字符
style:"root",
//样式为字典
classObj:{
//div 和 root均为class属性
div:true
root:false
},
}
},
methods: {
keyup() {
this.style ="div"
return this.name + this.sex
}
},
})
v.$mount("#root")
条件渲染
v-show=表达式 可以控制是否展示,直降元素的display设置为了none。
v-if= 表达式 则是对应的元素都没有。v-else(-if)类似。
使用if else if 结构不能被打断(在v-if else中加入普通的网页标签)。‘
但是v-if 常与template标签连用。
因为v-if会操作dom元素的修改,所以相对于v-show销量更低一点。
列表渲染
使用v-for对数组数据或者对象数据进行遍历。
建议key不要用index,因为在新增数据破坏了原有数据结构顺序,新数据可能会出错。
阅读:https://blog.csdn.net/AiHuanhuan110/article/details/98223011
// 遍历数组
<ul id="root">
<li v-for="student,index in students" :key="student.index">
// 第一个为列表中的元素,第二个为索引值
{{student.name}}--{{student.sex}}</li>
</ul>
//遍地对象,注意是value key
<li v-for="value,key in student" :key="key">
//遍历数字
<li v-for="number,key in 66" :key="key">
docker run -it -d --name 容器名-p 80:80 images
COPY ./ ./ #将同属于dockerfile文件夹下的所有东西复制到工作目录