Vue基础知识
vue核心
数据双向绑定
指令
指令带有v-的,表示vue特有的属性,他们会在渲染的DOM上, 应用特殊的响应式行为
导入支持
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
- v-bind:(bind:绑定),作用是绑定特别的元素,元素的值将会在vm对象中获取(缩写为:)
- if指令:作用与java中的if相同
<div id="app">
<h1 v-if="message==='a'">
A
</h1>
<h1 v-else-if="message==='b'">
B
</h1>
<h1 v-else>
C
</h1>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
message: "a"
}
});
</script>
- for指令:作用与java中的if相同
<div id="app">
<h1 v-for="item in items">
{{item.name}}
</h1>
</div>
<script>
let vm = new Vue({
el:'#app',
data:{
items:[
{name:"Spring"},
{name:"SpringMVC"},
{name:"Mybatis"}
]
}
})
</script>
绑定事件
- v-on:事件(v-on:缩写@)
v-on:click="sayhi"
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>绑定事件</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<button v-on:click="sayhi">click Me</button>
或者 <button @click="sayhi">click Me</button>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
message: "就TM你学java"
},
methods:{//要绑定的事件的方法要写在methods中,function()参数要填event
sayhi:function (event){
alert(this.message);
}
}
});
</script>
</body>
</html>
vue表单绑定(数据双向绑定)
- model:可以做到表单输入什么,页面的指定位置就显示什么
v-model就是vue的双向绑定的指令,能将页面上控件输入的值同步更新到相关绑定的data属性,也会在更新data绑定属性时候,更新页面上输入控件的值。
v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值
而总是将 Vue 实例的数据作为数据来源。
你应该通过 JavaScript 在组件的 data 选项中声明初始值。
单选框
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:v-module="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>双向绑定事件</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
请输入文本:<input type="text" v-model="message">{{message}}
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
message: "就TM你学java"
}
});
</script>
</body>
</html>
多选框
<!--多选框-->
<div id="app">
<p>请选择:</p>
<input type="checkbox" value="jack" v-model="usernames">
<input type="checkbox" value="mark" v-model="usernames">
<input type="checkbox" value="fuck" v-model="usernames">
<span>checked name:{{usernames}}</span>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
usernames:[]
}
});
组件
定义一个组件很简单,像这样
Vue.component("king",{
template:'<li>{{king}}</li>'+...+(后面还可以加)
});
简单理解就是,把一个或者多个标签,集合起来,给取一个别名。然后使用这个
别名标签,就能达到模板标签的作用。
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<div id="app">
<!--传递给组件的值 使用props(中间商)-->
<king v-for="item in items" v-bind:king="item"></king>
</div>
<script>
//定义一个组件:
Vue.component("king",{
props:["king"],
template:'<li>{{king}}</li>'
});
let vm = new Vue({
el: "#app",
data: {
items:["vue.js","Node.js","springBoot"]
}
});
</script>
如何将值传递到组件中呢?
我们直接传是达不到要求的,需要一个中间商props
别名标签中使用v-bind绑定一个属性,组件中使用props也一样绑定
同样的属性,然后template中的标签直接取值就可以了
<king v-for="item in items" v-bind:king="item"></king>
</div>
<script>
//定义一个组件:
Vue.component("king",{
props:["king"],
template:'<li>{{king}}</li>'
});
网络通信
1.可以使用jQuery.ajax
2.使用Axios
导入Axios
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.min.js"></script>
具体使用和需要注意的地方
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.26.0/axios.min.js"></script>
<div id="app">
<div>{{info.name}}</div>
<a v-bind:href="info.url">请点击</a>
</div>
<script>
let vm = new Vue({
el: "#app",
data(){//data方法,返回的是axios中的数据
//请求返回的参数,必须和json字符串的参数一样
return{
info:{
name:null,
url:null
}
}
},
mounted(){/*axios在钩子mounted中实现.钩子函数,需要链式编程*/
axios.get("../data.json").then(response=>(this.info=response.data))
}
});
</script>
计算属性(computed)
这是Vue中的特性,将计算出来的结果,缓存在属性中。就类似
缓存机制。属性中有参数发生改变,缓存的数据也会刷新
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<div id="app">
<p>CurrentTime:{{CurrentTime1}}</p>
</div>
<script>
let vm = new Vue({
el: "#app",
data:{
message:"haha"
},
computed:{
CurrentTime:()=>Date.now(),//返回一个时间戳
CurrentTime1:function (){
this.message;
return Date.now()
}
}
});
</script>
这里可以看出如果message的值没有发生改变,缓存的值也不会改变
,一旦message发生改变,缓存中的数据也会跟着改变
计算属性的主要特征是为了将不经常改变的计算结果进行缓存,以节省系统的开销
插槽slot
作用:slot用来连接组件
<div id="app">
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in items" :item="item"></todo-items>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
//定义一个组件:
Vue.component("todo", {
template:
'<div>\
<slot name="todo-title"></slot>\
<ul>\
<slot name="todo-items"></slot>\
</ul>\
</div>'
});
Vue.component('todo-title',{
props:['title'],
template:'<div>{{title}}</div>'
})
Vue.component('todo-items',{
props:['item'],
template:'<li>{{item}}</li>'
})
let vm = new Vue({
el: "#app",
data: {
title: "课程列表",
items:["狂神说java","狂神说前端","狂神说Linux"]
}
});
</script>
事件分发
基于插槽slot实现事件分发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>组件</title>
</head>
<body>
<div id="app">
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in items" :item="item" :index="index" @removes="remove"></todo-items>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
//定义一个组件:
Vue.component("todo", {
template:
'<div>\
<slot name="todo-title"></slot>\
<ul>\
<slot name="todo-items"></slot>\
</ul>\
</div>'
});
Vue.component('todo-title',{
props:['title'],
template:'<div>{{title}}</div>'
})
Vue.component('todo-items',{
props:['item','index'],
template:'<li>{{index}} {{item}} <button @click="remove">删除</button></li>',
methods:{
remove:function (index){
//通过this.$meit绑定view层的自定义事件
this.$emit('removes',index)
}
}
})
let vm = new Vue({
el: "#app",
data: {
title: "课程列表",
items:["狂神说java","狂神说前端","狂神说Linux"]
},
methods:{
remove:function (index){
this.items.splice(index,1);//使用splice可以删除指定的元素
}
}
});
</script>
</body>
</html>
解构赋值
在vue组件中我们可以在一个数组中提取出一个数组对象,这就叫解构赋值
比如
let a, b, rest;
[a, b] = [10, 20];
console.log(a);
// expected output: 10
console.log(b);
// expected output: 20
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest);
// expected output: Array [30,40,50]
这里的Array就成了一个对象
props
const app = Vue.createApp({})
app.component('blog-post', {
props: ['title'],
template: `<h4>{{ title }}</h4>`
})
app.mount('#blog-post-demo')
<div id="blog-post-demo" class="demo">
<blog-post title="My journey with Vue"></blog-post>
<blog-post title="Blogging with Vue"></blog-post>
<blog-post title="Why Vue is so fun"></blog-post>
</div>
当一个值被传递给一个 prop attribute 时,它就成为该组件实例中的一个 property。该 property 的值可以在模板中访问,就像任何其他组件 property 一样。
prop 都有指定的值类型,我们可以使用一个对象列出所有的props,
props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // 或任何其他构造函数
}
加:是代表动态赋值,没有加就是常量赋值
<!-- 动态赋予一个变量的值 -->
<blog-post :title="post.title"></blog-post>
<!-- 动态赋予一个复杂表达式的值 -->
<blog-post :title="post.title + ' by ' + post.author.name"></blog-post>