• 15、简单了解Vue


    1、vue概述

    Vue是一套前端框架,可以免除原生JavaScript中的DOM操作,简化书写。

    基于MVVM(Model-View-View Model)思想,实现数据的双向绑定,将编程的关注点放在数据上

    vue的官网:https://cn.vuejs.org/


    在之前我们学习了后端的框架Mybatis,它是用于简化jdbc代码的编写;而vue框架是前端的框架,是用来简化JavaScript代码的编写的。

    在我们之前的brand-demo2项目中,书写了大量的DOM操作,如下所示:

    当我们学习了vue以后,这些代码就不需要我们手动去写了。

    那么vue是如何简化DOM书写的呢?

    在之前的brand-demo2工程中,我们的关注点是放在了DOM操作上,

    这里先浅谈一下MVC思想,再说一下MVVM思想,如下是MVC思想图解:

    其中C 就是咱们 js 代码,M 就是数据,而 V 是页面上展示的内容,如下是我们在brand-demo2工程中写过的代码:

    MVC思想是无法进行双向绑定的。双向绑定是指当数据模型数据发生变化时,页面展示的会随之发生变化,而如果是表单数据发生变化,绑定的模型数据也随之发生变化。

    接着在说一下MVVM思想,如下图是三个组件的图解

    其中Model就是我们的数据,View是视图,也就是页面标签,用户可以通过浏览器看到的内容;Model和View是通过ViewModel对象进行双向绑定的,而ViewMode对象是vue 提供的。

    接下来让大家看一下双向绑定的效果,下图是提前准备的代码,输入框绑定了username模型数据,而在页面上也使用{{}}插值表达式绑定了username 模型数据 

    通过浏览器打开该页面可以看到如下页面

     当我们在输入框中输入内容,而输入框后面随之实时的展示我们输入的内容,这就是双向绑定的效果

    2、快速入门

    Vue的使用是比较简单的,总共分为三步:

    1、新建HTML页面,引入vue.js文件

    <script src="js/vue.js">script>

    2、在JS代码区域,创建vue核心对象,进行数据绑定

    1. /* 创建Vue对象 */
    2. new Vue({
    3. el: "#app",
    4. data() {
    5. return {
    6. username: ""
    7. }
    8. }
    9. });

    创建vue对象时,需要传递一个js对象,而该对象需要如下属性:

            el:用来指定哪些标签受vue管理。该属性取值#app中的app是需要受管理的标签的id属性值

            data:用来定义数据模型

            methods:用来定义函数。

    3、编写视图

    1. <div id="app">
    2. <input name="username" v-model="username" >
    3. {{username}}
    4. div>

    {{}}是vue中定义的插值表达式,在里面些数据模型,到时候会将该模型的数据值展示在这个位置。

    整体代码如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <input v-model="username">
    10. {{username}}
    11. div>
    12. <script src="js/vue.js">script>
    13. <script>
    14. //1. 创建Vue核心对象
    15. new Vue({
    16. el:"#app",
    17. data(){ // data() 是 ECMAScript 6 版本的新的写法
    18. return {
    19. username:""
    20. }
    21. }
    22. /*data: function () {
    23. return {
    24. username:""
    25. }
    26. }*/
    27. });
    28. script>
    29. body>
    30. html>

    3、vue指令

    指令:HTML标签上带有 v- 前缀的特殊属性,不同指令具有不同含义。

    常见的指令有:

    指令作用
    v-bind为HTML标签绑定属性值,如设置 href , css样式等
    v-model在表单元素上创建双向数据绑定
    v-on为HTML标签绑定事件
    v-if条件性的渲染某元素,判定为true时渲染,否则不渲染
    v-else
    v-else-if
    v-show根据条件展示某元素,区别在于切换的是display属性的值
    v-for列表渲染,遍历容器的元素或者对象的属性

    接下来学习一下这些指令

    3.1、v-bind & v-model 指令

    指令作用
    v-bind为HTML标签绑定属性值,如设置 href , css样式等
    v-model

    在表单元素上创建双向数据绑定

    v-bind

            该指令可以给标签原有属性绑定模型数据。这样模型数据发送变化,标签属性值也随之变化

    例如:

    bind:href="url">百度一下

    上面的 v-bind: 可以简化为 :,如下:

    1. <a :href="url">百度一下a>

    v-model

            该指令可以给表单标签绑定模型数据。这样就可以实现双向绑定的效果。

    例如:

    "username" v-model="username">

    代码演示:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <a v-bind:href="url">百度一下a>
    10. <a :href="url">百度一下a>
    11. <input v-model="url">
    12. div>
    13. <script src="js/vue.js">script>
    14. <script>
    15. //1. 创建Vue核心对象
    16. new Vue({
    17. el:"#app",
    18. data(){
    19. return{
    20. username:"",
    21. url:"http://www.baidu.com"
    22. }
    23. }
    24. })
    25. script>
    26. body>
    27. html>

    效果如下:

    当我们点击百度一下时就会跳转到百度页面

    并且通过浏览器打开上面页面,并且使用检查查看超链接的路径,该路径会根据输入框输入的路径变化而变化,这是因为超链接和输入框绑定的是同一个模型数据

    3.2、v-on指令 

    指令

    作用
    v-on为HTML标签绑定事件

    我们在页面定义一个按钮,并给该按钮使用 v-on 指令绑定单击事件,html代码如下:

    <input type="button" value="一个按钮" v-on:click="show()">

    而使用 v-on时还可以使用简化的写法,将 v-on 替换为 @,html代码如下:

    <input type="button" value="一个按钮" @click="show()">

    上面的代码绑定的show()需要在vue对象中的Elements属性中定义出来

    1. new Vue({
    2. el: "#app",
    3. methods: {
    4. show(){
    5. alert("我被点了");
    6. }
    7. }
    8. });

    注意:

            其中v-on:click绑定的方法 show()加不加括号都可以 如 show 或 show()

            v-on:后面的事件名称是之前原生事件属性名去掉on

            例如:

                    单击事件:事件属性名是onclick,而在vue中使用是v-on:click

                    失去焦点事件:时间属性名是onblur,而在vue中使用时v-on:blur

    整体页面代码如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <input type="button" value="一个按钮" v-on:click="show()"><br>
    10. <input type="button" value="一个按钮" @click="show">
    11. div>
    12. <script src="js/vue.js">script>
    13. <script>
    14. new vue({
    15. el:"#app",
    16. data(){
    17. return{
    18. }
    19. },
    20. methods:{
    21. show(){
    22. alert("我被点了,嘤嘤嘤");
    23. }
    24. }
    25. });
    26. script>
    27. body>
    28. html>

                    

    3.3、条件判断指令 

    下面通过代码演示一下。在vue中定义一个count的数据模型,如下:

    1. //1. 创建Vue核心对象
    2. new Vue({
    3. el:"#app",
    4. data(){
    5. return {
    6. count:3
    7. }
    8. }
    9. });

    现在要,当 count 模型的数据是3时,在页面上展示 div1 内容;当 count 模型的数据是4时,在页面上展示 div2 内容;count 模型数据是其他值时,在页面上展示 div3。这里为了动态改变模型数据 count 的值,再定义一个输入框绑定 count 模型数据。html 代码如下:

    1. <div id="app">
    2. <div v-if="count == 3">div1div>
    3. <div v-else-if="count == 4">div2div>
    4. <div v-else>div3div>
    5. <hr>
    6. <input v-model="count">
    7. div>

    整体页面代码如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <div v-if="count == 3">div1div>
    10. <div v-else-if="count == 4">div2div>
    11. <div v-else>div3div>
    12. <hr>
    13. <input v-model="count">
    14. div>
    15. <script src="js/vue.js">script>
    16. <script>
    17. //1、创建Vue核心对象
    18. new Vue({
    19. el:"#app",
    20. data(){
    21. return{
    22. count:3
    23. }
    24. }
    25. })
    26. script>
    27. body>
    28. html>

    通过浏览器打开页面并在输入框输入不同的值,效果如下:

     

    然后我们在看看 v-show 指令的效果,如果模型数据 count 的值是3时,展示 div v-show 内容,否则不展示,html页面代码如下

    1. <div v-show="count == 3">div v-showdiv>
    2. <br>
    3. <input v-model="count">

    浏览器打开效果如下:

    通过上述演示,我们发现v-show和v-if的效果一样,纳它们到底有什么区别呢?我们根据浏览器的检查功能查看源代码

    通过上图可以看出v-show不展示的原理是给对应的标签添加了display css属性,并将该属性值设置为none,这样就达到了隐藏的效果。而v-if指令是条件不满足时就不会渲染。 

    3.4、v-for指令

    指令作用
    v-for列表渲染,遍历容器的元素或者对象的属性

    这个指令看到名字就知道是用来遍历的,该指令使用格式如下:

    1. <标签 v-for="变量名 in 集合模型数据">
    2. {{变量名}}
    3. 标签>

    注意:

            需要循环那个标签,v-for指令就写在那个标签上

    如果在页面需要使用到集合模型数据的索引,就需要使用如下格式:

    1. <标签 v-for="(变量名,索引变量) in 集合模型数据">
    2. {{索引变量 + 1}} {{变量名}}
    3. 标签>

    代码演示如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <div v-for="addr in addrs">
    10. {{addr}} <br>
    11. div>
    12. <div v-for="(addr,i) in addrs">
    13. {{i+1}}--{{addr}} <br>
    14. div>
    15. div>
    16. <script src="js/vue.js">script>
    17. <script>
    18. new Vue({
    19. el:"#app",
    20. data(){
    21. return{
    22. addrs:["福建","东莞","深圳"]
    23. }
    24. }
    25. })
    26. script>
    27. body>
    28. html>

    通过浏览器打开效果如下

    4、生命周期

    生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法。

    状态阶段周期
    beforeCreate创建前
    create创建后
    beforeMount载入前
    mounted挂载完成
    beforeUpdate更新前
    updated更新后
    beforeDestroy销毁前
    destroyed销毁后

    下图是Vue官网提供的从创建 Vue 到效果 Vue 对象的整个过程及各个阶段对应的钩子函数

    看到上面的图,大家无需过多的关注这张图。这些钩子方法我们只关注 mounted 就行了。

    mounted:挂载完成,Vue初始化成功,HTML页面渲染成功。而以后我们会在该方法中发送异步请求,加载数据

    5、案例

    5.1、需求

    使用Vue简化之前在工程brand-dmeo2通过ajax完成的对品牌数据的查询和添加功能

     此案例只是使用 Vue 对前端代码进行优化,后端代码无需修改。

    5.2、查询所有的功能

    1、在brand.html页面引入vue的js文件

    <script src="js/vue.js">script>

    2、 创建 Vue 对象

    在vue对象中定义模型数据

    在勾子函数中发送异步请求,并将响应的数据赋值给数据模型

    1. new Vue({
    2. el: "#app",
    3. data() {
    4. return {
    5. brands:[]
    6. }
    7. },
    8. mounted() {
    9. // 页面加载完成后,发送异步请求,查询数据
    10. var _this = this;
    11. axios({
    12. method: "get",
    13. url: "http://localhost:8080/brand-demo2/selectAllServlet"
    14. }).then(function (resp) {
    15. _this.brands = resp.data;
    16. })
    17. }
    18. });

    3、修改视图

    定义

    ,指定该 div 标签受 Vue 管理

    body 标签中所有的内容拷贝作为上面 div 标签中

    删除表格的多余数据行,只留下一个

    在表格中的数据行上使用 v-for 指令遍历

    1. <tr v-for="(brand,i) in brands" align="center">
    2. <td>{{i + 1}}td>
    3. <td>{{brand.brandName}}td>
    4. <td>{{brand.companyName}}td>
    5. <td>{{brand.ordered}}td>
    6. <td>{{brand.description}}td>
    7. <td>{{brand.statusStr}}td>
    8. <td><a href="#">修改a> <a href="#">删除a>td>
    9. tr>

    整体代码如下

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <a href="addBrand.html"><input type="button" value="新增">a><br>
    10. <hr>
    11. <table id="brandTable" border="1" cellspacing="0" width="100%">
    12. <tr>
    13. <th>序号th>
    14. <th>品牌名称th>
    15. <th>企业名称th>
    16. <th>排序th>
    17. <th>品牌介绍th>
    18. <th>状态th>
    19. <th>操作th>
    20. tr>
    21. <tr v-for="(brand,i) in brands" align="center">
    22. <td>{{i+1}}td>
    23. <td>{{brand.brandName}}td>
    24. <td>{{brand.companyName}}td>
    25. <td>{{brand.ordered}}td>
    26. <td>{{brand.description}}td>
    27. <td>{{brand.statusStr}}td>
    28. <td><a href="#">修改a> <a href="#">删除a>td>
    29. tr>
    30. table>
    31. div>
    32. <script src="js/axios-0.18.0.js">script>
    33. <script src="js/vue.js">script>
    34. <script>
    35. new Vue({
    36. el: "#app",
    37. data() {
    38. return {
    39. brands: []
    40. }
    41. },
    42. mounted() {
    43. // 页面加载完成后,发送异步请求,查询数据
    44. var _this = this;
    45. axios({
    46. method: "get",
    47. url: "http://localhost:8080/brand-demo2/selectAllServlet"
    48. }).then(function (resp) {
    49. _this.brands = resp.data;
    50. })
    51. }
    52. });
    53. script>
    54. body>
    55. html>

    效果如下:

    5.3、添加功能

    页面操作效果如下:

    整体流程如下

     注意:

            前端代码的关键点在于使用v-model指令给标签项绑定模型数据,利用双向绑定特性,在发送异步请求时提交数据。

    1、在addbrand.html页面引入vue的js文件

    <script src="js/vue.js">script>

     2、创建vue对象

    在 Vue 对象中定义模型数据 brand

    定义一个 submitForm() 函数,用于给 提交 按钮提供绑定的函数

    submitForm() 函数中发送 ajax 请求,并将模型数据 brand 作为参数进行传递

    1. new Vue({
    2. el: "app",
    3. data() {
    4. return {
    5. brand: []
    6. };
    7. },
    8. methods: {
    9. submitForm() {
    10. // 发送ajax请求,添加
    11. var _this = this;
    12. axios({
    13. method: "post",
    14. url: "http://localhost:8080/brand-demo2/addServlet",
    15. data: _this.brand
    16. }).then(function (resp) {
    17. // 判断响应数据是否为 success
    18. if(resp.data() == "success"){
    19. location.href = "http://localhost:8080/brand-demo2/brand.html";
    20. }
    21. })
    22. }
    23. }
    24. });

    3、修改视图

    定义

    ,指定该 div 标签受 Vue 管理

    body 标签中所有的内容拷贝作为上面 div 标签中

    给每一个表单项标签绑定模型数据。最后这些数据要被封装到 brand 对象中

    1. <div id="app">
    2. <h3>添加品牌h3>
    3. <form action="" method="post">
    4. 品牌名称:<input id="brandName" v-model="brand.brandName" name="brandName"><br>
    5. 企业名称:<input id="companyName" v-model="brand.companyName" name="companyName"><br>
    6. 排序:<input id="ordered" v-model="brand.ordered" name="ordered"><br>
    7. 描述信息:<textarea rows="5" cols="20" id="description" v-model="brand.description"
    8. name="description">textarea><br>
    9. 状态:
    10. <input type="radio" name="status" v-model="brand.status" value="0">禁用
    11. <input type="radio" name="status" v-model="brand.status" value="1">启用<br>
    12. <input type="button" id="btn" value="提交">
    13. form>
    14. div>

    整体代码如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>添加品牌title>
    6. head>
    7. <body>
    8. <div id="app">
    9. <h3>添加品牌h3>
    10. <form action="" method="post">
    11. 品牌名称:<input id="brandName" v-model="brand.brandName" name="brandName"><br>
    12. 企业名称:<input id="companyName" v-model="brand.companyName" name="companyName"><br>
    13. 排序:<input id="ordered" v-model="brand.ordered" name="ordered"><br>
    14. 描述信息:<textarea rows="5" cols="20" id="description" v-model="brand.description"
    15. name="description">textarea><br>
    16. 状态:
    17. <input type="radio" name="status" v-model="brand.status" value="0">禁用
    18. <input type="radio" name="status" v-model="brand.status" value="1">启用<br>
    19. <input type="button" id="btn" value="提交">
    20. form>
    21. div>
    22. <script src="js/axios-0.18.0.js">script>
    23. <script src="js/vue.js">script>
    24. <script>
    25. new Vue({
    26. el: "app",
    27. data() {
    28. return {
    29. brand: []
    30. };
    31. },
    32. methods: {
    33. submitForm() {
    34. // 发送ajax请求,添加
    35. var _this = this;
    36. axios({
    37. method: "post",
    38. url: "http://localhost:8080/brand-demo2/addServlet",
    39. data: _this.brand
    40. }).then(function (resp) {
    41. // 判断响应数据是否为 success
    42. if (resp.data() == "success") {
    43. location.href = "http://localhost:8080/brand-demo2/brand.html";
    44. }
    45. })
    46. }
    47. }
    48. });
    49. script>
    50. body>
    51. html>

  • 相关阅读:
    2024 年如何复用 ChatGPT 从头开始​​快速学习 Python
    Unity塔防游戏的制作与实现
    pushgateway安装及Prometheus配置
    JDK安装详细教程
    vue3中遇到的问题
    激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相
    阶乘分解(筛素数+分解质因数C++)
    浅谈 synchronized 锁机制原理 与 Lock 锁机制
    氟茚香豆素,CAS号:6723-40-6
    LeetCode(Python)—— 杨辉三角(简单)
  • 原文地址:https://blog.csdn.net/weixin_56058578/article/details/128149142