简介:
Vue.js
目前最火的的一个前端框架,三大主流前端框架之一。其余两个是Angular
和React
。Vue.js
是一套构建用户界面的框架(一套完整的解决方案,对项目侵入性大,中途需要跟换框架则需要重构整个项目),只关注视图层,易上手,有配套的第三方类库。dom
操作;双向数据绑定,通过框架提供的指令,前端只需要关注业务逻辑,不再关心dom
如何渲染。MVVM模式介绍:
MVVM
是一种软件架构设计模式,由微软WPF和Silverlight的架构师Ken Cooper和Ted Peters开发,是一种简化用户界面的事件驱动编程方式。MVVM
源于经典的MVC(Model - View - Controller)
模式,MVVM
的核心是ViewModel
层,负责转换Model
中的数据对象来让数据变得更加容易管理和使用。其作用如下:
Model
层通过接口请求进行数据交互为什么使用MVVM?
MVVM
和MVC
模式一样,主要目的是分离视图(View
)和模型(Model
),有几大好处:
View
)可以独立于Model
变化和修改,一个ViewModel
可以绑定到不同的View
上,当View
变化的时候Model
可以不变,当Model
变化的时候View
也可以不变。ViewModel
里面,让很多View
重用这段视图逻辑ViewModel
来写。导入Vue
模块(在线CDN版本):
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
{
{message}}
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
var vm = new Vue({
el:"#app",
data:{
message:"hello,vue!"
}
})
script>
body>
html>
v-if
语句
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<h1 v-if="type==='A'">Ah1>
<h1 v-else-if="type==='B'" >Bh1>
<h1 v-else-if="type==='C'" >Ch1>
<h1 v-else>Noh1>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
type:'A'
}
});
script>
body>
html>
v-for
语句
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<li v-for="item in items">
{
{item.message}}
li>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data:{
items:[
{
message: "狂神说java"},
{
message: "狂神说前端"},
{
message: "狂神运维"}
]
}
});
script>
body>
html>
绑定事件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<button v-on:click="sayHi">click mebutton>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data:{
message:"狂神说java"
},
methods:{
//方法必须定义在vue的method对象中
sayHi:function (event){
alert(this.message)
}
}
});
script>
body>
html>
什么是双向数据绑定?
Vue.js
是一个MVVM
框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化,这也算是Vue.js
的精髓之处了。数据的双向绑定一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。
为什么要实现数据的双向绑定?
在Vue.js
中,如果使用Vuex
,可以进行数据的单向绑定。对于我们处理表单,Vue.js
的双向绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项绑定,方便跟踪;局部性数据流使用双向,简单易操作。
在表单中使用双向数据绑定
你可以使用v-model
指令在表单、
及
元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。
v-model
本质上不过是语法糖,它会负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
注意:v-model
会忽略所有表单元素的value、checked、selected特性的初始值而总是将Vue
实例的数据作为数据来源。你可以通过JavaScript在组件的data选项中声明初始值!
v-model
语句
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
下拉框:
<select v-model="xingxing">
<option value="" disabled>---请选择---option>
<option>Aoption>
<option>Boption>
<option>Coption>
select>
<span>value:{
{xingxing}}span>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data:{
xingxing:''
}
});
script>
body>
html>
如果v-model
表达式的初始值未能匹配任何选项,元素将被渲染为”未选中“状态。在iOS中,这会使得用户无法选择第一个选项。因为这样的情况下,iOS不会触发change事件。因此,更推荐像上面这样提供一个值为空的禁用选项。
Vue
组件什么是组件?
组件时可复用的Vue
实例,且带有一个名字。我们可以在一个通过new Vue创建的Vue
根实例中,把这个组件作为自定义元素来使用。
定义一个Vue
组件:
// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
data: function () {
return {
count: 0
}
},
template: ''
})
调用组件:
<div id="components-demo">
<button-counter>button-counter>
div>
创建Vue
对象:
new Vue({
el: '#components-demo' })
组件可以被复用
<div id="components-demo">
<button-counter>button-counter>
<button-counter>button-counter>
<button-counter>button-counter>
div>
当点击按钮时,每个组件都会各自独立维护它的count
。因为你每用一次组件,就会有一个它的新实例被创建。
一个组件的data
选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝
data: function () {
return {
count: 0
}
}
Vue.component
组件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<qinjiang v-for="item in items" v-bind:item="item">qinjiang>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script>
//定义一个vue组件component
Vue.component("qinjiang", {
props:['item'],
template: '{
{item}} '
});
var vm = new Vue({
el: "#app",
data:{
items: ["Java", "Linux", "前端"]
}
});
script>
body>
html>
为什么使用Axios?
Vue.js
自身并不包含AJAX的通信功能,为了解决通信问题,作者单独开发了一个名为vue-resource
的插件,不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios
框架,少用JQuery,因为它操作Dom太频繁!
第一个Axios应用程序
data.json
:
{
"name": "xingxing",
"age": 23,
"sex": "boy",
"address": {
"province": "ShannXi",
"city": "Xi'an",
"street": "GuoDu"
},
"url": "https://www.baidu.com/"
}
Axios
应用
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>
[v-clock]{
display: none;
}
style>
head>
<body>
<div id="vue" v-clock>
<div>{
{info.name}}div>
<div>{
{info.address.street}}div>
<a v-bind:href="info.url">click mea>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:'#vue',
data(){
return{
info:{
name:null,
age:null,
sex:null,
address:{
province:null,
city:null,
street:null
},
url:null
}
}
},
mounted(){
axios.get('../data.json').then(response=>(this.info=response.data));
}
});
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<title>Titletitle>
head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items :item="item" index slot="todo-items" v-bind:index="index"
v-for="(item, index) in todoItems" v-on:remove="removeItems(index)" :key="index">todo-items>
todo>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<script type="text/javascript">
Vue.component("todo",{
template:
'' +
' ' +
''
+
' ' +
'' +
''
});
Vue.component("todo-title",{
props:['title'],
template: '{
{title}}'
})
Vue.component("todo-items",{
props: ['item', 'index'],
template:'{
{index}}---{
{item}} ',
methods:{
remove:function (index){
this.$emit('remove',index);
}
}
});
let vm = new Vue({
el: "#app",
data:{
title:"秦老师系列课程",
todoItems:['狂神说Java', "狂神说前端", "狂神说Linux"]
},
methods:{
removeItems:function (index) {
console.log("删除了"+this.todoItems[index]+"OK");
this.todoItems.splice(index,1);
}
}
});
script>
body>
html>