Vue 简介 Vue 是一套构建用户界面的渐进式前端框架。 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。 通过尽可能简单的 API来实现响应数据的绑定和组合的视图组件。 特点 易用:在有HTML CSS JavaScript 的基础上,快速上手。 灵活:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用。 性能:20kb min+gzip运行大小、超快虛拟DOM、最省心的优化。 Vue 入门 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门</title> </head> <body> <div id="div"> {{msg}} </div> </body> <script src="js/vue.js"></script> <script> // 脚本 new Vue({ el:"#div", data:{ msg:"Hello Vue" } }) </script> </html> Vue 核心对象: 每一个Vue程序都是从一个Vue核心对象开始的 let vm = new Vue({ 选项列表; }) Vue的程序包含视图和脚本两个核心部分 选项列表 el选项: 用于接收获取到页面中的元素.(根据常用选择器获取) data选项: 用于保存当前Vue对象中的数据. 在视图中声明的变量需要在此处赋值 methods选项: 用于定义方法. 方法可以直接通过对象名调用, this代表当前Vue对象 数据绑定 在视图部分获取脚本部分的数据 {{变量名}} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门升级</title> </head> <body> <!-- 视图--> <div id="div"> <div>姓名:{{name}}</div> <div>班级:{{classRoom}}</div> <button onclick="hi()">打招呼</button> <button onclick="update()">修改班级</button> </div> </body> <script src="js/vue.js"></script> <script> // 脚本 let vm = new Vue({ el:"#div", data:{ name:"张三", classRoom:"不一班" }, methods:{ study(){ alert(this.name + "正在" + this.classRoom+"好好学习") } } }) // 定义打招呼的方法 function hi(){ vm.study(); } function update(){ vm.classRoom = "地球人" } </script> </html> Vue 常用指令 指令: 是带有v-前缀的我死属性, 不同指令具有不同含义. 例如v-html, v-if, v-for 使用指令时,通常编与在标签的属性上,值可以使用JS的表达式。 常用指令 指令 作用 v-html 把文本解析为HTML代码 v-bind 为HTML标签绑定属性值 v-if 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-else 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-else-if 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-show 根据条件展示某元素, 区别在于切换的是display属性的值 y-for 列表渲染, 遍历容器的元素或者对象的厲性 v-on 为HTML标签绑定事件 v-model 在表单元素上创建双向数据绑定 文本插值 v-html: 把文本解析为HTML代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文本插值</title> </head> <body> <div id="div"> <div>{{msg}}</div> <div v-html="msg"></div> </div> </body> <script src="../js/vue.js"></script> <script> let vm = new Vue({ el:"#div", data:{ msg:"<b>Hello Vue</b>" } }) </script> </html> 绑定属性 v-bind:为HTML标签绑定属性值 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>绑定属性</title> <style> .my{ border: 1px solid red; } </style> </head> <body> <div id="div"> <a v-bind:href="url">百度一下</a> <br> <a :href="url">百度一下</a> <br> <div :class="cls">我是div</div> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ url:"http://www.baidu.com", cls: "my" } }) </script> </html> 条件渲染 v-if: 条件性的渲染某元素, 判定为真时渲染,否则不渲染 v-else:条件性的渲染 v-else-if:条件性的渲染 v-show:根据条件展示某元素,区别在于切换的是display属性的值 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>条件渲染</title> </head> <body> <div id="div"> <!-- 判断num的值, 对3取余, 余数为0显示div1 余数为1显示div2 余数为2显示div3--> <div v-if="num % 3 == 0">div1</div> <div v-else-if="num % 3 == 1">div2</div> <div v-else>div3</div> <div v-show="flag">div4</div> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ num:2, flag:false } }) </script> </html> 列表渲染 v-for:列表渲染,遍历窗口的元素或者对象的属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>列表渲染</title> </head> <body> <div id="div"> <ul> <li v-for="name in names"> {{name}} </li> <li v-for="value in student"> {{value}} </li> </ul> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el: "#div", data:{ names:["张三","李四","王五"], student:{ name:"张三", age:23 } } }) </script> </html> 事件绑定 v-on: 为HTML标签绑定事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件绑定</title> </head> <body> <div id="div"> <div>{{name}}</div> <button v-on:click="change">改变div的内容</button> <button v-on:dblclick="change">改变div的内容</button> <button @click="change">改变div的内容</button> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ name:"来了呀, 老弟!" }, methods:{ change(){ this.name = "来了" } } }) </script> </html> 表单绑定, 只能表单使用 v-model:在表单元素上创建双向数据绑定 双向数据绑定 更新data数据, 页面中的数据也会更新 更新页面数据, data数据也会更新 MVVM模型(Model View ViewModel):是MVC模式的改进版 在前端页面中,JS对象表示 Model,页面表示View,两者做到了最大限度的分离。 将Model和View 关联起来的就是ViewModel,它是桥梁。 ViewModel 负责把 Model 的数据同步到 View 显示出来,还负责把 View 修改的数据同步回 Model. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表单绑定</title> </head> <body> <div id="div"> <form autocomplete="off"> 姓名: <input type="text" name="username" v-model="username"> <br> 年龄: <input type="number" name="age" v-model="age"> </form> </div> </body> <script src="../js/vue.js"></script> <script> new Vue({ el:"#div", data:{ username:"张三", age:23 } }) </script> </html> Element 组件库 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>快速入门</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <button>我是按钮</button> <br> <div id="div"> <template> <el-row class="mb-4"> <el-button>Default</el-button> <el-button type="primary">Primary</el-button> <el-button type="success">Success</el-button> <el-button type="info">Info</el-button> <el-button type="warning">Warning</el-button> <el-button type="danger">Danger</el-button> <el-button>中文</el-button> </el-row> <br> </template> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> <html lang="en"> <head> <meta charset="UTF-8"> <title>基础布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> .bg-purple-dark { background: #99a9bf; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } .grid-content { border-radius: 4px; min-height: 36px; } </style> </head> <body> <div id="div"> <template> <el-row> <el-col :span="24"><div class="grid-content bg-purple-dark"></div></el-col> </el-row> <el-row> <el-col :span="12"><div class="grid-content bg-purple"></div></el-col> <el-col :span="12"><div class="grid-content bg-purple-light"></div></el-col> </el-row> <el-row> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="8"><div class="grid-content bg-purple"></div></el-col> </el-row> </template> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> 布局方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>容器布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> .el-header, .el-footer { background-color: #B3C0D1; color: #333; text-align: center; line-height: 60px; } .el-aside { background-color: #D3DCE6; color: #333; text-align: center; line-height: 300px; } .el-main { background-color: #E9EEF3; color: #333; text-align: center; line-height: 600px; } </style> </head> <body> <div id="div"> <el-container> <el-header>Header</el-header> <el-container> <el-aside width="300px">Aside</el-aside> <el-container> <el-main>Main</el-main> <el-footer>Footer</el-footer> </el-container> </el-container> </el-container> </div> </body> <script> new Vue({ el:"#div" }) </script> </html> 表单组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>容器布局</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> <style> </style> </head> <body> <div id="div"> <el-form ref="form" :model="form" label-width="80px"> <el-form-item label="活动名称"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="活动区域"> <el-select v-model="form.region" placeholder="请选择活动区域"> <el-option label="区域一" value="shanghai"></el-option> <el-option label="区域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item label="活动时间"> <el-col :span="11"> <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker> </el-col> </el-form-item> <el-form-item label="即时配送"> <el-switch v-model="form.delivery"></el-switch> </el-form-item> <el-form-item label="活动性质"> <el-checkbox-group v-model="form.type"> <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox> <el-checkbox label="地推活动" name="type"></el-checkbox> <el-checkbox label="线下主题活动" name="type"></el-checkbox> <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="特殊资源"> <el-radio-group v-model="form.resource"> <el-radio label="线上品牌商赞助"></el-radio> <el-radio label="线下场地免费"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="活动形式"> <el-input type="textarea" v-model="form.desc"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">立即创建</el-button> <el-button>取消</el-button> </el-form-item> </el-form> </div> </body> <script> new Vue({ el:"#div", data() { return { form: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '' } } }, methods: { onSubmit() { console.log('submit!'); } } }) </script> </html> 表格组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表格组件</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <template> <el-table :data="tableData" stripe style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> <el-table-column label="操作" width="100"> <el-button size="mini" type="warning">编辑</el-button> <el-button size="mini" type="danger">编辑</el-button> </el-table-column> </el-table> </template> </div> </body> <script> new Vue({ el:"#div", data() { return { tableData: [{ date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1519 弄' }, { date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1516 弄' }] } } }) </script> </html> 顶部导航栏组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>顶部导航栏组件</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index="1">处理中心</el-menu-item> <el-submenu index="2"> <template slot="title">我的工作台</template> <el-menu-item index="2-1">选项1</el-menu-item> <el-menu-item index="2-2">选项2</el-menu-item> <el-menu-item index="2-3">选项3</el-menu-item> <el-submenu index="2-4"> <template slot="title">选项4</template> <el-menu-item index="2-4-1">选项1</el-menu-item> <el-menu-item index="2-4-2">选项2</el-menu-item> <el-menu-item index="2-4-3">选项3</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="3" disabled>消息中心</el-menu-item> <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item> </el-menu> <div class="line"></div> <el-menu :default-active="activeIndex2" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <el-menu-item index="1">处理中心</el-menu-item> <el-submenu index="2"> <template slot="title">我的工作台</template> <el-menu-item index="2-1">选项1</el-menu-item> <el-menu-item index="2-2">选项2</el-menu-item> <el-menu-item index="2-3">选项3</el-menu-item> <el-submenu index="2-4"> <template slot="title">选项4</template> <el-menu-item index="2-4-1">选项1</el-menu-item> <el-menu-item index="2-4-2">选项2</el-menu-item> <el-menu-item index="2-4-3">选项3</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="3" disabled>消息中心</el-menu-item> <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item> </el-menu> </div> </body> <script> new Vue({ el:"#div", data() { return { activeIndex: '1', activeIndex2: '1' }; }, methods: { handleSelect(key, keyPath) { console.log(key, keyPath); } } }) </script> </html> 侧边导航栏 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>侧边导航栏</title> <link rel="stylesheet" href="../element-ui/lib/theme-chalk/index.css"> <script src="../js2/vue.js"></script> <script src="../element-ui/lib/index.js"></script> </head> <body> <div id="div"> <el-row class="tac"> <el-col :span="3"> <h5>自定义颜色</h5> <el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-location"></i> <span>导航一</span> </template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template slot="title">选项4</template> <el-menu-item index="1-4-1">选项1</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="2"> <i class="el-icon-menu"></i> <span slot="title">导航二</span> </el-menu-item> <el-menu-item index="3" disabled> <i class="el-icon-document"></i> <span slot="title">导航三</span> </el-menu-item> <el-menu-item index="4"> <i class="el-icon-setting"></i> <span slot="title">导航四</span> </el-menu-item> </el-menu> </el-col> </el-row> </div> </body> <script> new Vue({ el:"#div", methods: { handleOpen(key, keyPath) { console.log(key, keyPath); }, handleClose(key, keyPath) { console.log(key, keyPath); } } }) </script> </html>