一、什么是vue?
1、渐进式框架,易用,灵活,高效,可以兼容其他框架
2、渐进式使项目由浅入深,由简单到复杂的方式进行开发
3、vue是双向数据绑定,不用操作DOM,即可改变页面,所以开发者能更好的的专注于业务逻辑
二、vue是基于虚拟DOM
vue是预先通过javascript进行计算,然后在将DOM渲染出来。因为这个DOM是预处理操作,并且没有真实的操作DOM,所以,叫做虚拟DOM
三、vue的基础知识
1、模板插值
<div id="app">
<h1>模板语法插值</h1>
<!-- v-one 禁止修改值 -->
<div v-once>v-one 禁止修改值:{{age}}</div>
<!--可以修改值 -->
<div>可以修改值:{{age}}</div>
<!-- 插入html标签 -->
<div>这是一个html标签:{{htmlmode}}</div>
<div v-html="htmlmode"></div>
<!-- 在模板使用表达式 -->
<div>模板中使用表达式:{{age + age2}}</div>
</div>
<script type="text/javascript">
var save_data = {
age: 1,
age2: 1,
htmlmode: '<p style="color:red;">天下无双</p>',
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data,
})
//改变data数据放的方式
vm.age = 2;
save_data.age = 3;
vm.$data.age = 4;
</script>
2、动态绑定属性
<div id="app">
<!-- 动态绑定属性 -->
<a v-bind:href="websize">跳转到百度</a>
<!-- 动态绑定样式 -->
<div v-bind:class="fontColor">动态绑定样式</div>
<!-- 表达式绑定class样式,可以多个绑定 -->
<div v-bind:class="{styleColor:isColor,styleSize:isSize}">表达式绑定class样式</div>
<!-- 数组内表达式绑定class样式,可以多个绑定 -->
<div v-bind:class="['styleColor',isSize?'styleSize':'']">数组内表达式绑定class样式</div>
<!-- 动态绑定行内样式 -->
<div v-bind:style="{color:colVal,background:isbg?'black':''}">动态绑定style行内样式</div>
</div>
<script type="text/javascript">
var save_data = {
websize: 'https://www.baidu.com/',
fontColor: 'styleColor',
isColor: true,
isSize: true,
colVal: 'red',
isbg: true,
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data,
})
</script>
<style>
.styleColor {
color: green;
}
.styleSize {
font-size: 30px;
}
</style>
3、条件渲染 v-if
<!-- 单个条件渲染 -->
<div id="app">
<div v-if="seeMe">你看不到我(不保留在dom中)</div>
<div v-show="seeSta">你看不到我(保留在dom中)</div>
<!-- 多个条件渲染 -->
<div v-if="keys == 1">满足条件1</div>
<div v-else-if="keys == 2">满足条件2</div>
<div v-else-if="keys == 3">满足条件3</div>
<div v-else>满足最后一个条件</div>
</div>
<script type="text/javascript">
var save_data = {
seeMe: false,
seeSta: false,
keys: 2,
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data,
})
</script>
4、列表渲染 v-for
1、可以遍历数组和对象,同时为了区分,每个遍历需要加上:key=“index”
2、注意value和index,一定要加上(),不然严格方式会报错
<div id="app">
<ul>
<li v-for="(value,key) in pList" v-bind:key="key">
数组渲染:{{key}} - {{value.name}}
</li>
</ul>
<ul>
<li v-for="(value,index) in numList" v-bind:key="index">
对象渲染:{{index}} - {{value}}
</li>
</ul>
</div>
<script type="text/javascript">
var save_data = {
pList: [
{name: "johnli"},
{ name: "mark"},
{ name: "rose"}
],
numList: {
name: 'rose',
sex: '女',
age: 18,
},
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data,
})
</script>
5、事件处理
<div id="app">
<button type="button" v-on:click="touchAct(1,$event)">
点击次数:{{tuchCount}}
</button>
</div>
<script type="text/javascript">
var save_data = {
tuchCount:0
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data,
methods: {
touchAct: function(type, e) {
this.tuchCount++;
}
},
})
</script>
6、表单双向绑定
<div id="app">
<form>
<div>
<label>text表单:</label>
<div><input v-model="inputVal"></div>
<div>{{inputVal}}</div>
</div>
<div>
<label>mark</label>
<input type="checkbox" value="mark" v-model="checkboxVal">
<label>rose</label>
<input type="checkbox" value="rose" v-model="checkboxVal">
<label>frank</label>
<input type="checkbox" value="frank" v-model="checkboxVal">
<div>{{checkboxVal}}</div>
</div>
<div>
<label>男</label>
<input type="radio" value="男" v-model="radioboxVal">
<label>女</label>
<input type="radio" value="女" v-model="radioboxVal">
<div>{{radioboxVal}}</div>
</div>
</form>
</div>
<script type="text/javascript">
var save_data = {
inputVal: '',
checkboxVal: [],
radioboxVal: '',
}
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: save_data
})
</script>
7、全局组件
(1)全局组件必须在vue实例化之前声明
(2)在任何地方都可以调用全局组件
(3)全局组件有两种内嵌式和单文件方式声明
(4)全局组件声明关键字
Vue.component()
<div id="app">
<div>
<head-model></head-model>
<button-model titles="按钮2"></button-model>
<button-model titles="按钮2"></button-model>
</div>
</div>
<script type="text/javascript">
//*
//*第一种全局组件声明方式
//*
Vue.component("button-model", {
//titles是组件传值
props: ['titles'],
//data必须是一个函数
data: function() {
return {
nums: 0
}
},
template: '<div><button v-on:click="showMark">{{titles}}:{{nums}}</button></div>',
methods: {
showMark: function() {
this.nums++;
}
}
})
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: {}
})
//*
//*第二种全局组件声明方式,单文件方式
//
import Head from './components/commen/Head';
Vue.components('head-model',Head );
new Vue({render:h=>h(App)}).$mount("#app")
</script>
8、局部组件
局部组件使用步骤:
(1)引入局部组件
(2)注册局部组件
(3)调用局部组件
<div id="app">
<div>
<test></test>
</div>
</div>
<script type="text/javascript">
//*
//*第一种局部组件声明方式
//*
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: {},
//局部组件
components:{
test:{
template:"<h1>这是一个局部组件</h1>"
}
}
})
</script>
<template>
<div id="Foot">
<!-- 3,调用局部组件-->
<test/>
<Test/>
<md-test/>
</div>
</template>
<script type="text/javascript">
//*
//*第二种局部组件,单文件方式
//*
//1,引入局部组件
import test form '/components/test';
exprot default{
//选择实例化目标
name: "Foot",
//2,注册局部组件
components:{
test //第一种写法
Test:test //第二种写法
'md-test':test//第三种写法
}
}
</script>
9、组件属性传值(父组件=>子组件)
(1)固定值传值,采用名值对。如:jyname是固定值传值
(2)变量传值,采用冒号+名=变量。如::marks=“markvalue”
(3)子组件不可直接修改父组件的值,需用通过注册事件(this.$emit())方式,返回到父组件修改
父组件
<template>
<div id="app">
//jyname是固定值传值
//:marks 属性绑定传值
//@setMarksPrent 来至子组件注册事件
<HelloWorld :marks="markvalue" jyname="这是一个固定值" @setMarksPrent="updateMarks" />
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
data() {
return {
markvalue: '这是一个变量值'
}
},
components: {
HelloWorld
},
methods: {
updateMarks: function (e) {
this.markvalue = e;
}
}
}
</script>
********************************************
子组件
<template>
<div class="hello">
<h1>{{ marks }}</h1>
<h1>{{ jyname }}</h1>
<button @click="setMarks">修改父组件marks的值</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
marks: {
type: String
},
jyname: {
type: String
}
},
methods:{
setMarks:function(){
//注册事件
//1,事件名称,2传值
this.$emit('setMarksPrent','修改成功')
}
}
}
</script>
10、生命周期钩子
<script type="text/javascript">
var vm = new Vue({
//选择实例化目标
el: "#app",
//存储数据
data: {},
//生命周期
//生命周期--1、实例化之后,数据data和event/watcher事件配置之前被调用
beforeCreate: function() {
console.log('beforeCreated');
},
//生命周期--2、实例创建完之后,挂在之前
//这里完成以下配置:
//(1)data
//(2)属性和方法运算
//(3)watch/event事件回调
created: function() {
console.log('created');
},
//生命周期--3、挂在之前,渲染函数首次被调用
beforeMount: function() {
console.log('beforeMount');
},
//生命周期--4、挂在成功,el被新创建的vm.$el替换
mounted: function() {
console.log('mounted');
},
//生命周期--5、数据变化之前
beforeUpdate: function() {
console.log('beforeUpdate');
},
//生命周期--6、组件DOM已经更新
updated: function() {
console.log('updated');
},
//生命周期--7、组件激活是调用
activated: function() {
console.log('activated');
},
//生命周期--8、组件停用时调用
deactivated: function() {
console.log('deactivated');
},
//生命周期--9、捕获来至子组件错误调用
errorCaptured: function() {
console.log('errorCaptured');
},
// //生命周期--10、销毁之前
beforeDestroy: function() {
console.log('beforeDestroy');
},
// //生命周期--11、销毁之后
destroyed: function() {
console.log('destroyed');
}
})
</script>
11、插槽
1、多个插槽,父组件使用solot属性区别,子组件使用name属性区分
2、样式可以存放到父组件或者子组件
3、标签中有变量,必须在父组件中完成转化
<!-- 这是父组件 -->
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App">
<!-- 多个插槽,name父组件使用solot属性区别,子组件使用name属性区分 -->
<div slot="title">这是插槽标题</div>
<!-- 标签中有变量,必须在父组件中完成转化 -->
<div slot="mark">这是插槽备注说明:{{solt_mars}}</div>
<!-- 作用域插槽 -->
<template v-slot:title="values">
<h2 >插槽标题:{{values.num}}</h2>
</template>
</HelloWorld>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
data(){
return {
solt_mars:'动态插槽内容'
}
},
components: {
HelloWorld
}
}
</script>
*************************************************
这是子组件
<template>
<div class="hello">
<slot name="title"></slot>
<div>这一个分界线</div>
<slot name="mark"></slot>
<slot name="title" :num="9527"></slot>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
}
</script>
12、动态组件和缓存
1,动态组件关键标签component :is=“动态组”
2,缓存关键组件keep-alive ,在keep-alive下的组件能够缓存数据
<template>
<div class="index">
<keep-alive>
<component :is="showModel"></component>
</keep-alive>
</div>
</template>
<script>
import One from '@/views/one.vue'
import Two from '@/views/two.vue'
export default {
name: 'index',
data() {
return {
showModel: 'Two'
}
},
components: {
One,
Two
}
}
</script>