本视频教程来自B站@遇见狂神说,有需要的朋友可以去搜索观看他的视频学习。
vue官方:https://cn.vuejs.org/v2/guide/
1.安装vue插件
2.导入 vue.js
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
3.编写view视图层
<!-- View 层 ,模板 -->
<div id="app">
</div>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- View 层 ,模板 -->
<div id="app">
{{message}}
</div>
<!-- 1.导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
// Model : 数据
data:{
message:"hello,Vue!"
}
});
</script>
</body>
</html>
v-if
v-if-else
v-else
<!--hexoPostRenderEscape:<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line">* 示例:</span><br><span class="line"></span><br><span class="line"> ```vue</span><br><span class="line"> <!DOCTYPE html></span><br><span class="line"> <html lang="en"></span><br><span class="line"> <head></span><br><span class="line"> <meta charset="UTF-8"></span><br><span class="line"> <title>Title</title></span><br><span class="line"> </head></span><br><span class="line"> <body></span><br><span class="line"> </span><br><span class="line"> <div id="app"></span><br><span class="line"> <h1 v-if="type==='A'">A</h1></span><br><span class="line"> <h1 v-else-if="type==='B'">B</h1></span><br><span class="line"> <h1 v-else-if="type==='D'">D</h1></span><br><span class="line"> <h1 v-else>C</h1></span><br><span class="line"> </div></span><br><span class="line"> </span><br><span class="line"> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></span><br><span class="line"> <script></span><br><span class="line"> var vm = new Vue({</span><br><span class="line"> el:"#app",</span><br><span class="line"> data:{</span><br><span class="line"> type:'A'</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> </script></span><br><span class="line"> </span><br><span class="line"> </body></span><br><span class="line"> </html></span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
v-for
指令可以绑定数组的数据来渲染一个项目列表:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<li v-for="(item,index) in items">
{{item.message}}---{{index}}
</li>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
items:[
{message:'silentcow说Java'},
{message: 'silentcow说前端'},
{message: 'silentcow说运维'}
]
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<button v-on:click="sayHi">click Me</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
message:"silentcow说Java"
},
methods:{ //方法必须定义在 Vue 的Methods对象中, v-on 事件
sayHi:function (event) {
alert(this.message)
}
}
});
</script>
</body>
</html>
官网文档:https://cn.vuejs.org/v2/guide/forms.html#%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95
用 v-model
指令在表单 、
及 `` 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model
本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
什么是双向数据绑定: v-model
Vue.js是一个MVVM框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了.
文本同步更新
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
输入的文本:<input type="text" v-model="message"> {{message}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
message:"123"
}
});
</script>
</body>
</html>
在文本区域插值 ({{text}}
) 并不会生效,应用 v-model
来代替。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<textarea v-model="message" placeholder="add multiple lines"></textarea>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
message:"123"
}
});
</script>
</body>
</html>
此处silent可随意书写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
性别:
<input type="radio" name="sex" value="男" v-model="silent">男
<input type="radio" name="se" value="女" v-model="silent">女
<p>
选中了谁:{{silent}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
silent:''
}
});
</script>
</body>
</html>
disabled
为了适应IOS
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
下拉框:
<select v-model="selected">
<option value="" disabled>---请选择---</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>您选择的是:{{selected}}</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
selected:''
}
});
</script>
</body>
</html>
单个复选框,绑定到布尔值:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<input type="checkbox" id="checkbox" v-model="checked">
<lable for="checkbox">{{checked}}</lable>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
checked:false
}
});
</script>
</body>
</html>
多个复选框,绑定到同一个数组:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<input type="checkbox" id="san" value="张三" v-model="checkedNames">
<lable for="san">张三</lable>
<input type="checkbox" id="si" value="李四" v-model="checkedNames">
<lable for="si">李四</lable>
<input type="checkbox" id="wu" value="王五" v-model="checkedNames">
<lable for="wu">王五</lable>
<p>
结拜兄弟的是:{{checkedNames}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el:"#app",
data:{
checkedNames:[]
}
});
</script>
</body>
</html>
注意:v-model
会忽略所有表单元素的 value
、checked
、selected
attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data
选项中声明初始值
Vue.component()
:注册组件my-component-li
:自定义组件的名字template
:组件的模板v-for="item in items"
:遍历Vue
实例中定义的名为items
的数组,并创建同等数量的组建;v-bind:item="item"
:将遍历的item
项绑定到组建中props
定义的名为item
属性上; = 号左边的item为props定义的属性名,右边的为item in items
中遍历的 item 项的值。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- View视图层 模板-->
<div id="app">
<!--组件:传递给组件中的值:props-->
<silent v-for="item in items" v-bind:cow="item"></silent>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
//定义一个Vue组建
Vue.component("silent",{
props:['cow'],
template:'<li>{{cow}}</li>'
});
new Vue({
el:"#app",
data:{
items:["java","linux","前端"]
}
});
</script>
</body>
</html>
官方:https://www.kancloud.cn/yunye/axios/234845
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
{
"name": "silentcow说Java",
"url": "https://www.csdn.net/",
"page": 1,
"isNonProfit": true,
"address": {
"street": "龙高街道",
"city": "陕西咸阳",
"country": "中国"
},
"links": [
{
"name": "bilibili",
"url": "https://www.bilibili.com/"
},
{
"name": "silentcow说Java",
"url": "https://www.bilibili.com/"
},
{
"name": "百度",
"url": "https://www.baidu.com/"
}
]
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- v-clock:解决闪烁问题-->
<style>
[v-clock]{
display: none;
}
</style>
</head>
<body>
<div id="app" v-clock>
<div>{{info.name}}</div>
<div>{{info.address.street}}</div>
<a v-bind:href="info.url">点我</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!--导入axios-->
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data(){
return{
//请求的返回值参数合适,必须和json字符串一样
info:{
name:null,
address:{
street:null
}
,url:null
}
}
},
mounted(){ //钩子函数,链式编程,ES6 新特性
axios.get('../data.json').then(response=>(this.info=response.data));
}
});
</script>
</body>
</html>
<!--hexoPostRenderEscape:<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"># 计算属性</span><br><span class="line"></span><br><span class="line">计算属性的重点突出在`属性`两个字上(属性是名词),首先它是个`属性`其次这个属性有`计算`的能力(计算是动词),这里的`计算`就是个函数;简单点说,它就是-个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为**缓存!**</span><br><span class="line"></span><br><span class="line">```vue</span><br><span class="line"><!DOCTYPE html></span><br><span class="line"><html lang="en"></span><br><span class="line"><head></span><br><span class="line"> <meta charset="UTF-8"></span><br><span class="line"> <title>Title</title></span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line"></span><br><span class="line"><div id="app"></span><br><span class="line"> <p>currentTime1:{{currentTime1()}}</p> <!--调用方法必须加括号--></span><br><span class="line"> <p>currentTime2:{{currentTime2}}</p></span><br><span class="line"></div></span><br><span class="line"></span><br><span class="line"><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></span><br><span class="line"><script></span><br><span class="line"> var vm = new Vue({</span><br><span class="line"> el:"#app",</span><br><span class="line"> data:{</span><br><span class="line"> message:"hello"</span><br><span class="line"> },</span><br><span class="line"> methods:{</span><br><span class="line"> currentTime1:function () {</span><br><span class="line"> return Date.now(); //返回一个时间戳</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> computed:{ //计算属性,methods,computed 方法名不能重名,重名之后,只会调用methods的方法</span><br><span class="line"> currentTime2:function () {</span><br><span class="line"> this.message;</span><br><span class="line"> return Date.now();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
注意: methods和computed里的东西不能重名 说明:. ● methods: 定义方法,调用方法使用currentTime1(). 需要带括号 ● computed: 定义计算属性,调用属性使用currentTime2, 不需要带括号: this.message是为了能够让currentTime2观察到数据变化而变化 ● 如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm. message-“qinjiang” ,改变下数据的值,再次测试观察效果!
结论:
调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;
在Vue.js
中我们使用<slot>
元素作为承载分发内容的出口,作者称之为 插槽,可以应用在组合组件的场景中。
官方:https://cn.vuejs.org/v2/guide/components-slots.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<to-do>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
</to-do>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// slot:插槽
Vue.component("to-do",{
template: '<div>\
<slot name="todo-title"></slot>\
<ur>\
<slot name="todo-items"></slot>\
</ur>\
</div>'
});
Vue.component("todo-title",{
props: ['title'],
template: '<div>{{title}}</div>'
});
Vue.component("todo-items",{
props: ['item'],
template:'<li>{{item}}</li>'
});
var vm = new Vue({
el:"#app",
data:{
title:"silent系列",
todoItems:['silentcow说Java','silentcow说前端','silentcow说C++']
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<to-do>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems"
:item="item" v-bind:index="index" v-on:remove="removeItems(index)"></todo-items>
</to-do>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// slot:插槽
Vue.component("to-do",{
template: '<div>\
<slot name="todo-title"></slot>\
<ur>\
<slot name="todo-items"></slot>\
</ur>\
</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.$emit:自定义事件分发
this.$emit('remove',index);
}
}
});
var vm = new Vue({
el:"#app",
data:{
title:"silent系列",
todoItems:['silentcow说Java','silentcow说前端','silentcow说C++']
},
methods: {
removeItems:function (index) {
this.todoItems.splice(index,1);//一次删除一个元素
}
}
});
</script>
</body>
</html>
核心:数据驱动,组件化
优点:借鉴了AngulaJS 的模块化开发 和 React 的虚拟Dom,虚拟Dom就是把Dom操作放到内存中执行;
常用的属性:
组件化:
遵循SoC 关注度分离原则,Vue是纯粹的视图框架,并不包含:比如Ajax之类的通信功能,为了解决通信问题,我们需要使用Axios框架做异步通信;
说明:
Vue的开发都是要基于NodeJS,实际开发采用vue-cli脚手架开发,vue-router路由,vuex做状态管理; Vue U,界面我们一般使用ElementUI(饿了么出品)。或者IC E(阿里巴巴出品!)来快速搭建前端项目~
创建webpack.config.js
配置文件:
1.创建项目
2.创建一个名为modules 的目录,用于防止JS 模块等资源文件
3.在modules下创建模块文件,如hello.js,用于编写JS模块相关代码
// 暴露一个方法
exports.sayHi = function () {
document.write("<h1>silentcow学ES6</h1>");
};
4.在modules下创建一个名为main.js的入口文件,用于打包时设置entry 属性
var hello = require("./hello");
hello.sayHi();
5.在项目目录下创建webpack.config.js配置文件,使用webpack命令打包
module.exports = {
entry: './modules/main.js',
output: {
filename:"./js/bundle.js"
}
};
6.在项目目录下创建HTML页面,如index.html, 导入WebPack打包后的JS文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="dist/js/bundle.js"></script>
</body>
</html>
7.在IDEA控制台中直接执行webpack;如果失败的话,就使用管理员权限运行即可! 8.运行HTML看效果
文章作者: silentcow