VUE&Element 你的名字 2024-03-26 19:43 56阅读 0赞 ### VUE&Element ### ### 1,VUE ### #### 1.1 概述 #### Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。 我们之前也学习过后端的框架 `Mybatis` ,`Mybatis` 是用来简化 `jdbc` 代码编写的;而 `VUE` 是前端的框架,是用来简化 `JavaScript` 代码编写的。前一天我们做了一个综合性的案例,里面进行了大量的DOM操作,如下 ![在这里插入图片描述][acafd7aacadd4a769b81fae54849799e.png] 学习了 `VUE` 后,这部分代码我们就不需要再写了。那么 `VUE` 是如何简化 DOM 书写呢? ==基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。==之前我们是将关注点放在了 DOM 操作上;而要了解 `MVVM` 思想,必须先聊聊 `MVC` 思想,如下图就是 `MVC` 思想图解 ![在这里插入图片描述][6d7e007e93ab4068b5f4b9104452d613.png] C 就是咱们 js 代码,M 就是数据,而 V 是页面上展示的内容,如下图是我们之前写的代码 ![在这里插入图片描述][69161efcb919461f8ff0d9cbc33f59e1.png] `MVC` 思想是没法进行双向绑定的。双向绑定是指当数据模型数据发生变化时,页面展示的会随之发生变化,而如果表单数据发生变化,绑定的模型数据也随之发生变化。接下来我们聊聊 `MVVM` 思想,如下图是三个组件图解![在这里插入图片描述][8390d3abcff94ce194d0a5b39a22b2bd.png] 图中的 `Model` 就是我们的数据,`View` 是视图,也就是页面标签,用户可以通过浏览器看到的内容;`Model` 和 `View` 是通过 `ViewModel` 对象进行双向绑定的,而 `ViewModel` 对象是 `Vue` 提供的。接下来让大家看一下双向绑定的效果,下图是提前准备的代码,输入框绑定了 `username` 模型数据,而在页面上也使用 `{ {}}` 绑定了 `username` 模型数据 ![在这里插入图片描述][c677e14014d147f185598f7c787cbfa9.png] 通过浏览器打开该页面可以看到如下页面 ![在这里插入图片描述][5e0833c6b2b741639a73a3fa7e53074c.png] 当我们在输入框中输入内容,而输入框后面随之实时的展示我们输入的内容,这就是双向绑定的效果。 #### 1.2 快速入门 #### Vue 使用起来是比较简单的,总共分为如下三步: 1. **新建 HTML 页面,引入 Vue.js文件** <script src="js/vue.js"></script> 2. **在JS代码区域,创建Vue核心对象,进行数据绑定** new Vue({ el: "#app", data() { return { username: "" } } }); 创建 Vue 对象时,需要传递一个 js 对象,而该对象中需要如下属性: * `el` : 用来指定哪儿些标签受 Vue 管理。 该属性取值 `#app` 中的 `app` 需要是受管理的标签的id属性值 * `data` :用来定义数据模型 * `methods` :用来定义函数。这个我们在后面就会用到 3. **编写视图** <div id="app"> <input name="username" v-model="username" > { {username}} </div> `{ {}}` 是 Vue 中定义的 `插值表达式` ,在里面写数据模型,到时候会将该模型的数据值展示在这个位置。 **整体代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <input v-model="username"> <!--插值表达式--> { {username}} </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ // data() 是 ECMAScript 6 版本的新的写法 return { username:"" } } /*data: function () { return { username:"" } }*/ }); </script> </body> </html> #### 1.3 Vue 指令 #### \*\*指令:\*\*HTML 标签上带有 v- 前缀的特殊属性,不同指令具有不同含义。例如:v-if,v-for… 常用的指令有: <table> <thead> <tr> <th><strong>指令</strong></th> <th><strong>作用</strong></th> </tr> </thead> <tbody> <tr> <td>v-bind</td> <td>为HTML标签绑定属性值,如设置 href , css样式等</td> </tr> <tr> <td>v-model</td> <td>在表单元素上创建双向数据绑定</td> </tr> <tr> <td>v-on</td> <td>为HTML标签绑定事件</td> </tr> <tr> <td>v-if</td> <td>条件性的渲染某元素,判定为true时渲染,否则不渲染</td> </tr> <tr> <td>v-else</td> <td></td> </tr> <tr> <td>v-else-if</td> <td></td> </tr> <tr> <td>v-show</td> <td>根据条件展示某元素,区别在于切换的是display属性的值</td> </tr> <tr> <td>v-for</td> <td>列表渲染,遍历容器的元素或者对象的属性</td> </tr> </tbody> </table> 接下来我们挨个学习这些指令 ##### 1.3.1 v-bind & v-model 指令![在这里插入图片描述][05e29d219add4ecc9d5b89ce7fbf6e18.png] ##### * **v-bind** 该指令可以给标签原有属性绑定模型数据。这样模型数据发生变化,标签属性值也随之发生变化 例如: <a v-bind:href="url">百度一下</a> 上面的 `v-bind:"` 可以简化写成 `:` ,如下: <!-- v-bind 可以省略 --> <a :href="url">百度一下</a> * **v-model** 该指令可以给表单项标签绑定模型数据。这样就能实现双向绑定效果。例如: <input name="username" v-model="username"> **代码演示:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <a v-bind:href="url">点击一下</a> <a :href="url">点击一下</a> <input v-model="url"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { username:"", url:"https://www.baidu.com" } } }); </script> </body> </html> 通过浏览器打开上面页面,并且使用检查查看超链接的路径,该路径会根据输入框输入的路径变化而变化,这是因为超链接和输入框绑定的是同一个模型数据 ![在这里插入图片描述][62f49bc8e033465185b4b4aaab01caa9.png] ##### 1.3.2 v-on 指令 ##### ![在这里插入图片描述][8a78673d8a8c4431905ff1b8322ffdc9.png] 我们在页面定义一个按钮,并给该按钮使用 `v-on` 指令绑定单击事件,html代码如下 <input type="button" value="一个按钮" v-on:click="show()"> 而使用 `v-on` 时还可以使用简化的写法,将 `v-on:` 替换成 `@`,html代码如下 <input type="button" value="一个按钮" @click="show()"> 上面代码绑定的 `show()` 需要在 Vue 对象中的 `methods` 属性中定义出来 new Vue({ el: "#app", methods: { show(){ alert("我被点了"); } } }); > 注意:`v-on:` 后面的事件名称是之前原生事件属性名去掉on。 > > 例如: > > * 单击事件 : 事件属性名是 onclick,而在vue中使用是 `v-on:click` > * 失去焦点事件:事件属性名是 onblur,而在vue中使用时 `v-on:blur` **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <input type="button" value="一个按钮" v-on:click="show()"><br> <input type="button" value="一个按钮" @click="show()"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { username:"", } }, methods:{ show(){ alert("我被点了..."); } } }); </script> </body> </html> ##### 1.3.3 条件判断指令 ##### ![在这里插入图片描述][8de0171200184673aa33f3858798cbf7.png] 接下来通过代码演示一下。在 Vue中定义一个 `count` 的数据模型,如下 //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { count:3 } } }); 现在要实现,当 `count` 模型的数据是3时,在页面上展示 `div1` 内容;当 `count` 模型的数据是4时,在页面上展示 `div2` 内容;`count` 模型数据是其他值时,在页面上展示 `div3`。这里为了动态改变模型数据 `count` 的值,再定义一个输入框绑定 `count` 模型数据。html 代码如下: <div id="app"> <div v-if="count == 3">div1</div> <div v-else-if="count == 4">div2</div> <div v-else>div3</div> <hr> <input v-model="count"> </div> **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div v-if="count == 3">div1</div> <div v-else-if="count == 4">div2</div> <div v-else>div3</div> <hr> <input v-model="count"> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { count:3 } } }); </script> </body> </html> 通过浏览器打开页面并在输入框输入不同的值,效果如下![在这里插入图片描述][7003dd278a70423fa813c0a6b1f78485.png] 然后我们在看看 `v-show` 指令的效果,如果模型数据 `count` 的值是3时,展示 `div v-show` 内容,否则不展示,html页面代码如下 <div v-show="count == 3">div v-show</div> <br> <input v-model="count"> 浏览器打开效果如下: ![在这里插入图片描述][d29a619c2d6046b89dd058063cd199e0.png] 通过上面的演示,发现 `v-show` 和 `v-if` 效果一样,那它们到底有什么区别呢?我们根据浏览器的检查功能查看源代码![在这里插入图片描述][7bde1d8fda98490e9e3b30f9d6794a3e.png] 通过上图可以看出 `v-show` 不展示的原理是给对应的标签添加 `display` css属性,并将该属性值设置为 `none` ,这样就达到了隐藏的效果。而 `v-if` 指令是条件不满足时根本就不会渲染。 ##### 1.3.4 v-for 指令 ##### ![在这里插入图片描述][5a99092ef0874043ab06d907ed3b1ede.png] 这个指令看到名字就知道是用来遍历的,该指令使用的格式如下: <标签 v-for="变量名 in 集合模型数据"> { {变量名}} </标签> > 注意:需要循环那个标签,`v-for` 指令就写在那个标签上。 如果在页面需要使用到集合模型数据的索引,就需要使用如下格式: <标签 v-for="(变量名,索引变量) in 集合模型数据"> <!--索引变量是从0开始,所以要表示序号的话,需要手动的加1--> { {索引变量 + 1}} { {变量名}} </标签> **代码演示:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div v-for="addr in addrs"> { {addr}} <br> </div> <hr> <div v-for="(addr,i) in addrs"> { {i+1}}--{ {addr}} <br> </div> </div> <script src="js/vue.js"></script> <script> //1. 创建Vue核心对象 new Vue({ el:"#app", data(){ return { addrs:["北京","上海","西安"] } } }); </script> </body> </html> 通过浏览器打开效果如下 ![在这里插入图片描述][8a91371889d3446fb2aac7b58a52ef39.png] #### 1.4 生命周期 #### 生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法。![在这里插入图片描述][4a77efd5ca6843c780c15a2c07633484.png] 下图是 Vue 官网提供的从创建 Vue 到效果 Vue 对象的整个过程及各个阶段对应的钩子函数![在这里插入图片描述][8c537035b8e84c8aa45327e44c60eb03.png] 看到上面的图,大家无需过多的关注这张图。这些钩子方法我们只关注 `mounted` 就行了。 `mounted`:挂载完成,Vue初始化成功,HTML页面渲染成功。而以后我们会在该方法中发送异步请求,加载数据。 #### 1.5 案例 #### ##### 1.5.1 需求 ##### 使用 Vue 简化我们之前ajax做的品牌列表数据查询和添加功能 ![在这里插入图片描述][13c42a4627304e77bd8c846f09e0ce59.png] 此案例只是使用 Vue 对前端代码进行优化,后端代码无需修改。 ##### 1.5.2 查询所有功能 ##### ![在这里插入图片描述][2b707f2886a64d68a1cb88f68c6759a2.png] 1. **在 brand.html 页面引入 vue 的js文件** <script src="js/vue.js"></script> 2. **创建 Vue 对象** * 在 Vue 对象中定义模型数据 * 在钩子函数中发送异步请求,并将响应的数据赋值给数据模型 new Vue({ el: "#app", data(){ return{ brands:[] } }, mounted(){ // 页面加载完成后,发送异步请求,查询数据 var _this = this; axios({ method:"get", url:"http://localhost:8080/brand-demo/selectAllServlet" }).then(function (resp) { _this.brands = resp.data; }) } }) 3. **修改视图** * 定义 `<div id="app"></div>` ,指定该 `div` 标签受 Vue 管理 * 将 `body` 标签中所有的内容拷贝作为上面 `div` 标签中 * 删除表格的多余数据行,只留下一个 * 在表格中的数据行上使用 `v-for` 指令遍历 <tr v-for="(brand,i) in brands" align="center"> <td>{ {i + 1}}</td> <td>{ {brand.brandName}}</td> <td>{ {brand.companyName}}</td> <td>{ {brand.ordered}}</td> <td>{ {brand.description}}</td> <td>{ {brand.statusStr}}</td> <td><a href="#">修改</a> <a href="#">删除</a></td> </tr> **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <a href="addBrand.html"><input type="button" value="新增"></a><br> <hr> <table id="brandTable" border="1" cellspacing="0" width="100%"> <tr> <th>序号</th> <th>品牌名称</th> <th>企业名称</th> <th>排序</th> <th>品牌介绍</th> <th>状态</th> <th>操作</th> </tr> <!-- 使用v-for遍历tr --> <tr v-for="(brand,i) in brands" align="center"> <td>{ {i + 1}}</td> <td>{ {brand.brandName}}</td> <td>{ {brand.companyName}}</td> <td>{ {brand.ordered}}</td> <td>{ {brand.description}}</td> <td>{ {brand.statusStr}}</td> <td><a href="#">修改</a> <a href="#">删除</a></td> </tr> </table> </div> <script src="js/axios-0.18.0.js"></script> <script src="js/vue.js"></script> <script> new Vue({ el: "#app", data(){ return{ brands:[] } }, mounted(){ // 页面加载完成后,发送异步请求,查询数据 var _this = this; axios({ method:"get", url:"http://localhost:8080/brand-demo/selectAllServlet" }).then(function (resp) { _this.brands = resp.data; }) } }) </script> </body> </html> ##### 1.5.3 添加功能 ##### 页面操作效果如下:![在这里插入图片描述][59dfce1977e24a60b18ede347d0bdb5d.png] 整体流程如下 ![在这里插入图片描述][4885ffc4af184c68b97f4131ed66cb72.png] > 注意:前端代码的关键点在于使用 `v-model` 指令给标签项绑定模型数据,利用双向绑定特性,在发送异步请求时提交数据。 1. **在 addBrand.html 页面引入 vue 的js文件** <script src="js/vue.js"></script> 2. **创建 Vue 对象** * 在 Vue 对象中定义模型数据 `brand` * 定义一个 `submitForm()` 函数,用于给 `提交` 按钮提供绑定的函数 * 在 `submitForm()` 函数中发送 ajax 请求,并将模型数据 `brand` 作为参数进行传递 new Vue({ el: "#app", data(){ return { brand:{ } } }, methods:{ submitForm(){ // 发送ajax请求,添加 var _this = this; axios({ method:"post", url:"http://localhost:8080/brand-demo/addServlet", data:_this.brand }).then(function (resp) { // 判断响应数据是否为 success if(resp.data == "success"){ location.href = "http://localhost:8080/brand-demo/brand.html"; } }) } } }) 3. **修改视图** * 定义 `<div id="app"></div>` ,指定该 `div` 标签受 Vue 管理 * 将 `body` 标签中所有的内容拷贝作为上面 `div` 标签中 * 给每一个表单项标签绑定模型数据。最后这些数据要被封装到 `brand` 对象中 <div id="app"> <h3>添加品牌</h3> <form action="" method="post"> 品牌名称:<input id="brandName" v-model="brand.brandName" name="brandName"><br> 企业名称:<input id="companyName" v-model="brand.companyName" name="companyName"><br> 排序:<input id="ordered" v-model="brand.ordered" name="ordered"><br> 描述信息:<textarea rows="5" cols="20" id="description" v-model="brand.description" name="description"></textarea><br> 状态: <input type="radio" name="status" v-model="brand.status" value="0">禁用 <input type="radio" name="status" v-model="brand.status" value="1">启用<br> <input type="button" id="btn" @click="submitForm" value="提交"> </form> </div> **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加品牌</title> </head> <body> <div id="app"> <h3>添加品牌</h3> <form action="" method="post"> 品牌名称:<input id="brandName" v-model="brand.brandName" name="brandName"><br> 企业名称:<input id="companyName" v-model="brand.companyName" name="companyName"><br> 排序:<input id="ordered" v-model="brand.ordered" name="ordered"><br> 描述信息:<textarea rows="5" cols="20" id="description" v-model="brand.description" name="description"></textarea><br> 状态: <input type="radio" name="status" v-model="brand.status" value="0">禁用 <input type="radio" name="status" v-model="brand.status" value="1">启用<br> <input type="button" id="btn" @click="submitForm" value="提交"> </form> </div> <script src="js/axios-0.18.0.js"></script> <script src="js/vue.js"></script> <script> new Vue({ el: "#app", data(){ return { brand:{ } } }, methods:{ submitForm(){ // 发送ajax请求,添加 var _this = this; axios({ method:"post", url:"http://localhost:8080/brand-demo/addServlet", data:_this.brand }).then(function (resp) { // 判断响应数据是否为 success if(resp.data == "success"){ location.href = "http://localhost:8080/brand-demo/brand.html"; } }) } } }) </script> </body> </html> 通过上面的优化,前端代码确实简化了不少。但是页面依旧是不怎么好看,那么接下来我们学习 Element,它可以美化页面。 ### 2,Element ### Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。 Element 提供了很多组件(组成网页的部件)供我们使用。例如 超链接、按钮、图片、表格等等~ 如下图左边的是我们编写页面看到的按钮,上图右边的是 Element 提供的页面效果,效果一目了然。 ![在这里插入图片描述][53db4c539129417b825ae0a69ea788cc.png] 我们学习 Element 其实就是学习怎么从官网拷贝组件到我们自己的页面并进行修改,官网网址是 https://element.eleme.cn/#/zh-CN 进入官网能看到如下页面 ![在这里插入图片描述][4376a38b7270418a938cf686105c9e81.png] 接下来直接点击 `组件` ,页面如下 ![在这里插入图片描述][b466bb1bf269404a875c867967222eca.png] #### 2.1 快速入门 #### 1. 将资源 `element-ui` 文件夹直接拷贝到项目的 `webapp` 下。目录结构如下 ![在这里插入图片描述][ad97f4cf29a14c2da4099d8084a12d13.png] 2. 创建页面,并在页面引入Element 的css、js文件 和 Vue.js <script src="vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> 3. .创建Vue核心对象 Element 是基于 Vue 的,所以使用Element时必须要创建 Vue 对象 <script> new Vue({ el:"#app" }) </script> 4. 官网复制Element组件代码 ![在这里插入图片描述][3c2e19834a0e4ef9a8f625f89c291b0d.png] 在左菜单栏找到 `Button 按钮` ,然后找到自己喜欢的按钮样式,点击 `显示代码` ,在下面就会展示出对应的代码,将这些代码拷贝到我们自己的页面即可。 **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <el-row> <el-button>默认按钮</el-button> <el-button type="primary">主要按钮</el-button> <el-button type="success">成功按钮</el-button> <el-button type="info">信息按钮</el-button> <el-button type="warning">警告按钮</el-button> <el-button type="danger">删除</el-button> </el-row> <el-row> <el-button plain>朴素按钮</el-button> <el-button type="primary" plain>主要按钮</el-button> <el-button type="success" plain>成功按钮</el-button> <el-button type="info" plain>信息按钮</el-button> <el-button type="warning" plain>警告按钮</el-button> <el-button type="danger" plain>危险按钮</el-button> </el-row> <el-row> <el-button round>圆角按钮</el-button> <el-button type="primary" round>主要按钮</el-button> <el-button type="success" round>成功按钮</el-button> <el-button type="info" round>信息按钮</el-button> <el-button type="warning" round>警告按钮</el-button> <el-button type="danger" round>危险按钮</el-button> </el-row> <el-row> <el-button icon="el-icon-search" circle></el-button> <el-button type="primary" icon="el-icon-edit" circle></el-button> <el-button type="success" icon="el-icon-check" circle></el-button> <el-button type="info" icon="el-icon-message" circle></el-button> <el-button type="warning" icon="el-icon-star-off" circle></el-button> <el-button type="danger" icon="el-icon-delete" circle></el-button> </el-row> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el:"#app" }) </script> </body> </html> #### 2.2 Element 布局 #### Element 提供了两种布局方式,分别是: * Layout 布局 * Container 布局容器 ##### 2.2.1 Layout 局部 ##### 通过基础的 24 分栏,迅速简便地创建布局。也就是默认将一行分为 24 栏,根据页面要求给每一列设置所占的栏数。 ![在这里插入图片描述][4845a3dbb7fb4b8791bf63b99073e423.png] 在左菜单栏找到 `Layout 布局` ,然后找到自己喜欢的按钮样式,点击 `显示代码` ,在下面就会展示出对应的代码,显示出的代码中有样式,有html标签。将样式拷贝我们自己页面的 `head` 标签内,将html标签拷贝到 `<div id="app"></div>` 标签内。 **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .el-row { margin-bottom: 20px; } .el-col { border-radius: 4px; } .bg-purple-dark { background: #99a9bf; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } .grid-content { border-radius: 4px; min-height: 36px; } .row-bg { padding: 10px 0; background-color: #f9fafc; } </style> </head> <body> <div id="app"> <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> <el-row> <el-col :span="6"><div class="grid-content bg-purple"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple"></div></el-col> <el-col :span="6"><div class="grid-content bg-purple-light"></div></el-col> </el-row> <el-row> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> <el-col :span="4"><div class="grid-content bg-purple-light"></div></el-col> </el-row> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el:"#app" }) </script> </body> </html> 现在需要添加一行,要求该行显示8个格子,通过计算每个格子占 3 栏,具体的html 代码如下 <!-- 添加一行,8个格子 24/8 = 3 --> <el-row> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple"></div></el-col> <el-col :span="3"><div class="grid-content bg-purple-light"></div></el-col> </el-row> ##### 2.2.2 Container 布局容器 ##### 用于布局的容器组件,方便快速搭建页面的基本结构。如下图就是布局容器效果。 如下图是官网提供的 Container 布局容器实例:![在这里插入图片描述][31bc8f4fb16748cebe0e081fcc819694.png] 该效果代码中包含了样式、页面标签、模型数据。将里面的样式 `<style>` 拷贝到我们自己页面的 `head` 标签中;将html标签拷贝到 `<div id="app"></div>` 标签中,再将数据模型拷贝到 `vue` 对象的 `data()` 中。 **整体页面代码如下:** <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .el-header { background-color: #B3C0D1; color: #333; line-height: 60px; } .el-aside { color: #333; } </style> </head> <body> <div id="app"> <el-container style="height: 500px; border: 1px solid #eee"> <el-aside width="200px" style="background-color: rgb(238, 241, 246)"> <el-menu :default-openeds="['1', '3']"> <el-submenu index="1"> <template slot="title"><i class="el-icon-message"></i>导航一</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">选项4-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="2"> <template slot="title"><i class="el-icon-menu"></i>导航二</template> <el-submenu index="2-1"> <template slot="title">选项1</template> <el-menu-item index="2-1-1">选项1-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="3"> <template slot="title"><i class="el-icon-setting"></i>导航三</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="3-1">选项1</el-menu-item> <el-menu-item index="3-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="3-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="3-4"> <template slot="title">选项4</template> <el-menu-item index="3-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> </el-menu> </el-aside> <el-container> <el-header style="text-align: right; font-size: 12px"> <el-dropdown> <i class="el-icon-setting" style="margin-right: 15px"></i> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>查看</el-dropdown-item> <el-dropdown-item>新增</el-dropdown-item> <el-dropdown-item>删除</el-dropdown-item> </el-dropdown-menu> </el-dropdown> <span>王小虎</span> </el-header> <el-main> <el-table :data="tableData"> <el-table-column prop="date" label="日期" width="140"> </el-table-column> <el-table-column prop="name" label="姓名" width="120"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> </el-main> </el-container> </el-container> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el:"#app", data() { const item = { date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }; return { tableData: Array(20).fill(item) } } }) </script> </body> </html> #### 2.3 案例 #### 其他的组件我们通过完成一个页面来学习。 我们要完成如下页面效果 ![在这里插入图片描述][7640d579264b41b09816de23c1bc8d79.png] 要完成该页面,我们需要先对这个页面进行分析,看页面由哪儿几部分组成,然后到官网进行拷贝并修改。页面总共有如下组成部分![在这里插入图片描述][8997dd3996e746aeb22604bd3f829d2b.png] 还有一个是当我们点击 `新增` 按钮,会在页面正中间弹出一个对话框,如下 ![在这里插入图片描述][98c9503c2e36428e80f887391d242526.png] ##### 2.3.1 准备基本页面 ##### <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el: "#app" }) </script> </body> </html> ##### 2.3.2 完成表格展示 ##### 使用 Element 整体的思路就是 拷贝 + 修改。 ###### 2.3.2.1 拷贝![在这里插入图片描述][85643adfe763435ea6e9b3d46fcab663.png] ###### 在左菜单栏找到 `Table 表格`并点击,右边主体就会定位到表格这一块,找到我们需要的表格效果(如上图),点击 `显示代码` 就可以看到这个表格的代码了。 将html标签拷贝到 `<div id="app"></div>` 中,如下:![在这里插入图片描述][e2cc9fd450b9416a911e21b2018cd876.png] 将css样式拷贝到我们页面的 `head` 标签中,如下 ![在这里插入图片描述][9e441c4ea0c24e7db44c6e0393c2c615.png] 将方法和模型数据拷贝到 Vue 对象指定的位置 ![在这里插入图片描述][ae52bc1a73e24f03879090ad5edb1d73.png] 拷贝完成后通过浏览器打开可以看到表格的效果 ![在这里插入图片描述][d78707501c6943a2b8fa76a5e642180e.png] 表格效果出来了,但是显示的表头和数据并不是我们想要的,所以接下来就需要对页面代码进行修改了。 ###### 2.3.2.2 修改 ###### 1. **修改表头和数据** 下面是对表格代码进行分析的图解。根据下图说明修改自己的列数和列名![在这里插入图片描述][ebcdcc2564b84827b975770a3d19591d.png] 修改完页面后,还需要对绑定的模型数据进行修改,下图是对模型数据进行分析的图解![在这里插入图片描述][0788e2f983464f67a4992074167ddc77.png] 2. **给表格添加操作列** 从之前的表格拷贝一列出来并对其进行修改。按钮是从官网的 `Button 按钮` 组件中拷贝并修改的![在这里插入图片描述][a62bcdc685b1431e964a6463e9baa44b.png] 3. **给表格添加复选框列和标号列** 给表格添加复选框和标号列,效果如下 ![在这里插入图片描述][0b0a8432e0774c29aefbdb15490ac847.png]![在这里插入图片描述][adf328416ea24fd69e600e47fdc0fb58.png] 此效果也是从 Element 官网进行拷贝,先找到对应的表格效果,然后将其对应代码拷贝到我们的代码中,如下是复选框列官网效果图和代码![在这里插入图片描述][9dee79a4bf9a43ab99a6cd1ca6ef3c36.png] 这里需要注意在 `<el-table>` 标签上有一个事件 `@selection-change="handleSelectionChange"` ,这里绑定的函数也需要从官网拷贝到我们自己的页面代码中,函数代码如下: ![在这里插入图片描述][52f51fd1583f4a219f435bc4428af07c.png] 从该函数中又发现还需要一个模型数据 `multipleSelection` ,所以还需要定义出该模型数据 标号列也用同样的方式进行拷贝并修改。 ##### 2.3.3 完成搜索表单展示 ##### 在 Element 官网找到横排的表单效果,然后拷贝代码并进行修改![在这里插入图片描述][0132216981a2482fb708aebcaa786050.png] 点击上面的 `显示代码` 后,就会展示出对应的代码,下面是对这部分代码进行分析的图解![在这里插入图片描述][d8832406851f4091a0941285babba829.png] 然后根据我们要的效果修改代码。 ##### 2.3.4 完成批量删除和新增按钮展示 ##### 从 Element 官网找具有着色效果的按钮,并将代码拷贝到我们自己的页面上![在这里插入图片描述][2e35d1f405334b82b6e9201ebe3d4734.png] ##### 2.3.5 完成对话框展示 ##### 在 Element 官网找对话框,如下:![在这里插入图片描述][8cfdf5e0d2e34ea581d0e94d0b177102.png] 下面对官网提供的代码进行分析![在这里插入图片描述][f878eb7eeae6433b9493cc7d7b3a9e85.png] 上图分析出来的模型数据需要在 Vue 对象中进行定义。 ##### 2.3.6 完成分页条展示 ##### 在 Element 官网找到 `Pagination 分页` ,在页面主体部分找到我们需要的效果,如下![在这里插入图片描述][9abc428124c94784b068bffac6aaaab3.png] 点击 `显示代码` ,找到 `完整功能` 对应的代码,接下来对该代码进行分析 ![在这里插入图片描述][59bc27239fb6442ba8b70a467bfff4c3.png] 上面代码属性说明: * `page-size` :每页显示的条目数 * `page-sizes` : 每页显示个数选择器的选项设置。 `:page-sizes="[100,200,300,400]"` 对应的页面效果如下:![在这里插入图片描述][01fbc0ff2d8e432fb5989f39ae233f31.png] * `currentPage` :当前页码。我们点击那个页码,此属性值就是几。 * `total` :总记录数。用来设置总的数据条目数,该属性设置后, Element 会自动计算出需分多少页并给我们展示对应的页码。 事件说明: * `size-change` :pageSize 改变时会触发。也就是当我们改变了每页显示的条目数后,该事件会触发。 * `current-change` :currentPage 改变时会触发。也就是当我们点击了其他的页码后,该事件会触发。 ##### 2.3.7 完整页面代码 ##### <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .el-table .warning-row { background: oldlace; } .el-table .success-row { background: #f0f9eb; } </style> </head> <body> <div id="app"> <!--搜索表单--> <el-form :inline="true" :model="brand" class="demo-form-inline"> <el-form-item label="当前状态"> <el-select v-model="brand.status" placeholder="当前状态"> <el-option label="启用" value="1"></el-option> <el-option label="禁用" value="0"></el-option> </el-select> </el-form-item> <el-form-item label="企业名称"> <el-input v-model="brand.companyName" placeholder="企业名称"></el-input> </el-form-item> <el-form-item label="品牌名称"> <el-input v-model="brand.brandName" placeholder="品牌名称"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">查询</el-button> </el-form-item> </el-form> <!--按钮--> <el-row> <el-button type="danger" plain>批量删除</el-button> <el-button type="primary" plain @click="dialogVisible = true">新增</el-button> </el-row> <!--添加数据对话框表单--> <el-dialog title="编辑品牌" :visible.sync="dialogVisible" width="30%"> <el-form ref="form" :model="brand" label-width="80px"> <el-form-item label="品牌名称"> <el-input v-model="brand.brandName"></el-input> </el-form-item> <el-form-item label="企业名称"> <el-input v-model="brand.companyName"></el-input> </el-form-item> <el-form-item label="排序"> <el-input v-model="brand.ordered"></el-input> </el-form-item> <el-form-item label="备注"> <el-input type="textarea" v-model="brand.description"></el-input> </el-form-item> <el-form-item label="状态"> <el-switch v-model="brand.status" active-value="1" inactive-value="0" ></el-switch> </el-form-item> <el-form-item> <el-button type="primary" @click="addBrand">提交</el-button> <el-button @click="dialogVisible = false">取消</el-button> </el-form-item> </el-form> </el-dialog> <!--表格--> <template> <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="index" width="50"> </el-table-column> <el-table-column prop="brandName" label="品牌名称" align="center"> </el-table-column> <el-table-column prop="companyName" label="企业名称" align="center"> </el-table-column> <el-table-column prop="ordered" align="center" label="排序"> </el-table-column> <el-table-column prop="status" align="center" label="当前状态"> </el-table-column> <el-table-column align="center" label="操作"> <el-row> <el-button type="primary">修改</el-button> <el-button type="danger">删除</el-button> </el-row> </el-table-column> </el-table> </template> <!--分页工具条--> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[5, 10, 15, 20]" :page-size="5" layout="total, sizes, prev, pager, next, jumper" :total="400"> </el-pagination> </div> <script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el: "#app", methods: { tableRowClassName({ row, rowIndex}) { if (rowIndex === 1) { return 'warning-row'; } else if (rowIndex === 3) { return 'success-row'; } return ''; }, // 复选框选中后执行的方法 handleSelectionChange(val) { this.multipleSelection = val; console.log(this.multipleSelection) }, // 查询方法 onSubmit() { console.log(this.brand); }, // 添加数据 addBrand(){ console.log(this.brand); }, //分页 handleSizeChange(val) { console.log(`每页 ${ val} 条`); }, handleCurrentChange(val) { console.log(`当前页: ${ val}`); } }, data() { return { // 当前页码 currentPage: 4, // 添加数据对话框是否展示的标记 dialogVisible: false, // 品牌模型数据 brand: { status: '', brandName: '', companyName: '', id:"", ordered:"", description:"" }, // 复选框选中数据集合 multipleSelection: [], // 表格数据 tableData: [{ brandName: '华为', companyName: '华为科技有限公司', ordered: '100', status: "1" }, { brandName: '华为', companyName: '华为科技有限公司', ordered: '100', status: "1" }, { brandName: '华为', companyName: '华为科技有限公司', ordered: '100', status: "1" }, { brandName: '华为', companyName: '华为科技有限公司', ordered: '100', status: "1" }] } } }) </script> </body> </html> [acafd7aacadd4a769b81fae54849799e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/748074f232e549229587053b7369958e.png [6d7e007e93ab4068b5f4b9104452d613.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/dc19fb7031e14bb38c9e47d7fc3ef6b9.png [69161efcb919461f8ff0d9cbc33f59e1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/46eb4d2cd5cb426f897c1aee8ea9f2a9.png [8390d3abcff94ce194d0a5b39a22b2bd.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/ccdf8a1513f241258e7fc2414bbc2c3e.png [c677e14014d147f185598f7c787cbfa9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/eded58a5d6a240eb904f69d98f47481b.png [5e0833c6b2b741639a73a3fa7e53074c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/e959c6a659214eb48b0d1e4705006d8a.png [05e29d219add4ecc9d5b89ce7fbf6e18.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/37008f11af3e460681780628961212f0.png [62f49bc8e033465185b4b4aaab01caa9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b4acfbf659354faa953fcf2ca28a88d9.png [8a78673d8a8c4431905ff1b8322ffdc9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/a6014773f90c47269a5ce588e9c80478.png [8de0171200184673aa33f3858798cbf7.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/5dbf59c788de40f7acfd874da795331a.png [7003dd278a70423fa813c0a6b1f78485.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/310e980592be458f98703a3acc4f61ca.png [d29a619c2d6046b89dd058063cd199e0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/4924fd71c24a457e9605d0d4278d80ed.png [7bde1d8fda98490e9e3b30f9d6794a3e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b85b8a9e837040c58642b93e2e0b7239.png [5a99092ef0874043ab06d907ed3b1ede.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b8582c0751904e03a5b8a0f75c3706b8.png [8a91371889d3446fb2aac7b58a52ef39.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b8703cb29bf743b4b964bbc01bae2c91.png [4a77efd5ca6843c780c15a2c07633484.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/e7351b23fdb0413da93a803afca45eed.png [8c537035b8e84c8aa45327e44c60eb03.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/ecb06cb94b174a2aaaee32d257a187f5.png [13c42a4627304e77bd8c846f09e0ce59.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/6aadde8544374fdda733072b5b455e4b.png [2b707f2886a64d68a1cb88f68c6759a2.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/0c24fd2f9ace410481f69f784cccf3dd.png [59dfce1977e24a60b18ede347d0bdb5d.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/81fd654d76314bfabdaa44e9b47ce441.png [4885ffc4af184c68b97f4131ed66cb72.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/ff82f6bb43254fc085a620e7b5f6b176.png [53db4c539129417b825ae0a69ea788cc.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/5ba824fb0daf4e638f3ef28598ce3a31.png [4376a38b7270418a938cf686105c9e81.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/c3606e9b458c49df8ca98689a2cb6497.png [b466bb1bf269404a875c867967222eca.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/2d7b02491e364bbf8930c7aa50701604.png [ad97f4cf29a14c2da4099d8084a12d13.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/98321d93308f40a488a63e4dd31263ad.png [3c2e19834a0e4ef9a8f625f89c291b0d.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/66d93204a12748749c4c0c6101d8b4f3.png [4845a3dbb7fb4b8791bf63b99073e423.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/15125e21f1604278bc33571a1ac8a483.png [31bc8f4fb16748cebe0e081fcc819694.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/e92f42c0fbba49c7a885176e241628a1.png [7640d579264b41b09816de23c1bc8d79.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b843e912ac7a46aea0494a8c64d43009.png [8997dd3996e746aeb22604bd3f829d2b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/563a28bd0e4343078d9c75382f09d5ab.png [98c9503c2e36428e80f887391d242526.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/dc5590988be6438d89755dc0ea5bee74.png [85643adfe763435ea6e9b3d46fcab663.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/747f03b9380942cb9330038d29866625.png [e2cc9fd450b9416a911e21b2018cd876.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b02994e2db3045779c56b132c65f075c.png [9e441c4ea0c24e7db44c6e0393c2c615.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/6d15886ebe874807960d8c3685ead457.png [ae52bc1a73e24f03879090ad5edb1d73.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/7c1ffaf28d2544a6be9b6f48a328d3ad.png [d78707501c6943a2b8fa76a5e642180e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/35906c6a5f6846feb0ec2e6d721a8eda.png [ebcdcc2564b84827b975770a3d19591d.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/e48d85d0ab3241dd9773379df629ac13.png [0788e2f983464f67a4992074167ddc77.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/6691caa941a4484ca4249fdc553a6779.png [a62bcdc685b1431e964a6463e9baa44b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/df75a270b3444120a6acfa67f3e5eb49.png [0b0a8432e0774c29aefbdb15490ac847.png]: https://img-blog.csdnimg.cn/0b0a8432e0774c29aefbdb15490ac847.png [adf328416ea24fd69e600e47fdc0fb58.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/723369ee03e245c58497bba58a90cc3c.png [9dee79a4bf9a43ab99a6cd1ca6ef3c36.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/5972bc11ee4545ab91385da45fc3602b.png [52f51fd1583f4a219f435bc4428af07c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/1340d022668441c0a2108e14d89e0a2b.png [0132216981a2482fb708aebcaa786050.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/d5ee09b39b9343c1a8e888af315ab299.png [d8832406851f4091a0941285babba829.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/b51c566dedef4c988354ae8fa490402d.png [2e35d1f405334b82b6e9201ebe3d4734.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/c5c8e62671374b9b9fe98a6c09be4ded.png [8cfdf5e0d2e34ea581d0e94d0b177102.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/ead9a1da46ad477c81b87849569a1973.png [f878eb7eeae6433b9493cc7d7b3a9e85.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/422471aa3ec44680a22f42b4a5bf8a16.png [9abc428124c94784b068bffac6aaaab3.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/1388317eb7a7431aa4e4607fe073b20f.png [59bc27239fb6442ba8b70a467bfff4c3.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/e513a7a9603543eca8d67846c182d7ff.png [01fbc0ff2d8e432fb5989f39ae233f31.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/26/2050edde6fb845cf8967612bb33ef19e.png
相关 vueElement之table合并单元格 运用情景:在某些场景需要table表格 合并行 或者合并列 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0c 不念不忘少年蓝@/ 2022年10月25日 15:27/ 0 赞/ 383 阅读
还没有评论,来说两句吧...