• 【Vue】模板语法,插值、指令、过滤器、计算属性及监听属性(内含面试题及毕设等实用案例)上篇


    一、引言

    1、什么是模板语法?

    Vue 的模板语法是一种用于在 HTML 中声明式地渲染 Vue 组件的语法。它基于 HTML,并通过特定的模板语法扩展了 HTML。Vue 使用了一种称为 “Mustache” 语法的模板插值来绑定数据到 HTML 元素上。

    在 Vue 的模板语法中,你可以使用双大括号({{}})将数据绑定到 HTML 元素上,这样数据的值会被动态地替换到相应的位置。

    下面我会以语法的介绍和案例为大家做一个示范

    二、插值

    1、文本

     {{msg}}

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>插值title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h2>文本h2>
    12. <p>{{msg}}p>
    13. div>
    14. body>
    15. <script type="text/javascript">
    16. new Vue({
    17. el: '#app',
    18. data() {
    19. return {
    20. msg: 'hello Vue.js'
    21. };
    22. }
    23. })
    24. script>
    25. html>

    2、 html

    使用v-html指令用于输出html代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>插值title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h2>htmlh2>
    12. div>
    13. body>
    14. <script type="text/javascript">
    15. new Vue({
    16. el: '#app',
    17. data() {
    18. return {
    19. htmlstr: '

      这是一个v-html指令html代码

      '
    20. };
    21. }
    22. })
    23. script>
    24. html>

    3、属性

              HTML属性中的值应使用v-bind指令

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>插值title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h2>vue中的属性h2>
    12. <a v-bind:href="hrefstr">4399a>
    13. div>
    14. body>
    15. <script type="text/javascript">
    16. new Vue({
    17. el: '#app',
    18. data() {
    19. return {
    20. hrefstr: 'https://www.4399.com/'
    21. };
    22. }
    23. })
    24. script>
    25. html>

    他在我这里是一个链接,因为我使用了标签,这样它可以做一个跳转

    4、表达式

              Vue提供了完全的JavaScript表达式支持

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>插值title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h2>表达式h2>
    12. 表达式:{{number + 1}}<br>
    13. 截取:{{str.substring(0, 4).toUpperCase()}}<br>
    14. 三元:{{ok ? 'yes' : 'no'}}
    15. div>
    16. body>
    17. <script type="text/javascript">
    18. new Vue({
    19. el: '#app',
    20. data() {
    21. return {
    22. number: 59,
    23. str: 'Java、python、php、C++',
    24. ok: false,
    25. };
    26. }
    27. })
    28. script>
    29. html>

           

    5、class、style绑定

              使用方式:

                    v-bind:class="expression"

                    v-bind:style="expression"

              expression的类型:字符串、数组、对象

    这里做了一个class、style一起的案例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>插值title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <style>
    10. .f30 {
    11. font-size: 30px;
    12. color: red;
    13. }
    14. style>
    15. <body>
    16. <div id="app">
    17. <h2>class、style绑定h2>
    18. <b :class="msg3">class、style绑定b>
    19. div>
    20. body>
    21. <script type="text/javascript">
    22. new Vue({
    23. el: '#app',
    24. data() {
    25. return {
    26. msg3: 'f30'
    27. };
    28. }
    29. })
    30. script>
    31. html>

    三、指令、动态参数

    指的是带有“v-”前缀的特殊属性

    核心指令:

             (v-if|v-else|v-else-if)/v-show/v-for/v-bind/v-on/v-mode)

    1、v-if|v-else|v-else-if

    根据其后表达式的bool值进行判断是否渲染该元素

            他们只能是兄弟元素

                     v-else-if上一个兄弟元素必须是v-if

                     v-else上一个兄弟元素必须是v-if或者是v-else-if

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>指令title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <p>v-if|v-else|v-else-ifp>
    12. 分数:<input v-model="score"/>
    13. <div v-if="score>=90">大神div>
    14. <div v-else-if="score>=80 && score<90">优秀div>
    15. <div v-else-if="score>=70 && score<80">优秀div>
    16. <div v-else-if="score>=60 && score<70">良好div>
    17. <div v-else="score<60">还需努力div>
    18. div>
    19. body>
    20. <script type="text/javascript">
    21. new Vue({
    22. el: '#app',
    23. data() {
    24. return {
    25. score: 78
    26. };
    27. }
    28. })
    29. script>
    30. html>

    2、v-show

    v-if类似,只是会渲染其身后表达式为false的元素,而且会给这样的元素添加css代码:style="display:none"

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>指令title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <p>v-if|v-else|v-else-ifp>
    12. 分数:<input v-model="score"/>
    13. <div v-if="score>=90">大神div>
    14. <div v-else-if="score>=80 && score<90">优秀div>
    15. <div v-else-if="score>=70 && score<80">优秀div>
    16. <div v-else-if="score>=60 && score<70">良好div>
    17. <div v-else="score<60">还需努力div>
    18. <p>v-showp>
    19. <div v-show="score>90">v-show-成为大神的人div>
    20. <div v-if="score>90">v-if-成为大神的人div>
    21. div>
    22. body>
    23. <script type="text/javascript">
    24. new Vue({
    25. el: '#app',
    26. data() {
    27. return {
    28. score: 78
    29. };
    30. }
    31. })
    32. script>
    33. html>

    只有当我们的分数达到了90以上就会显示出来

    3、v-for

    类似JS的遍历:

                              遍历数组: v-for="item in items", items是数组,item为数组中的数组元素

                             遍历对象: v-for="(value,key,index) in stu", value属性值,key属性名,index下标

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>指令title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <p>v-forp>
    12. 下拉框:
    13. <select v-model="hobbySelected">
    14. <option v-for="h in hobby" :value="h.id">{{h.name}}option>
    15. select><br>
    16. 复选框:
    17. <div v-for="h in hobby">
    18. <input :value="h.id" type='checkbox'/>{{h.name}}
    19. div>
    20. div>
    21. body>
    22. <script type="text/javascript">
    23. // 绑定边界 ES6具体体现
    24. new Vue({
    25. el: '#app',
    26. data() {
    27. return {
    28. hobby: [
    29. {id: "1", name: "唱"},
    30. {id: "2", name: "跳"},
    31. {id: "3", name: "rap"},
    32. {id: "4", name: "篮球"}
    33. ]
    34. };
    35. }
    36. })
    37. script>
    38. html>

    4、动态参数

      从2.6.0开始,可以用方括号括起来的JavaScript表达式作为一个指令的参数

      ...

      同样地,你可以使用动态参数为一个动态的事件名绑定处理函数

     

      注1:动态参数表达式有一些语法约束,evName无效,evname有效,回避大写

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>过滤器title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h3>动态参数h3>
    12. <button @click="dt">点一下button>
    13. 事件:<input v-model="evname"/>
    14. <button v-on:[evname]="dt">点击事件button>
    15. div>
    16. body>
    17. <script type="text/javascript">
    18. // 绑定边界 ES6具体体现
    19. new Vue({
    20. el: '#app',
    21. data() {
    22. return {
    23. evname: "click"
    24. };
    25. },
    26. methods: {
    27. dt() {
    28. alert("还得是你,说点就点");
    29. }
    30. }
    31. })
    32. script>
    33. html>

    四、过滤器

    1、局部过滤器

    1. new Vue({
    2.  filters:{'filterName':function(value){}}
    3. });

    vue允许你自定义过滤器,被用作一些常见的文本格式化,格式如下:

    {{ name | capitalize }}

    注1:过滤器函数接受表达式的值作为第一个参数

    注2:过滤器可以串联    

            {{ message | filterA | filterB }}

    注3:过滤器是JavaScript函数,因此可以接受参数:

            {{ message | filterA('arg1', arg2) }}

    注4:js定义一个类

            function Stu(){};

            Stu.prototype.add(a,b){};//添加一个新的实例方法

            Stu.update(a,b){};//添加一个新的类方法

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>过滤器title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h3>局部过滤器基本使用h3>
    12. {{msg}}<br>
    13. {{msg | singleA}}
    14. <h3>局部过滤器串行使用h3><br>
    15. {{msg | singleA | singleB}}
    16. <h3>局部过滤器传参h3><br>
    17. {{msg|param(3,5)}}
    18. div>
    19. body>
    20. <script type="text/javascript">
    21. // 绑定边界 ES6具体体现
    22. new Vue({
    23. el: '#app',
    24. data() {
    25. return {
    26. msg: 'python、Java、php、C++'
    27. };
    28. },
    29. methods: {
    30. handle() {
    31. alert("触发事件");
    32. }
    33. },
    34. filters: {
    35. 'singleA': function (val) {
    36. return val.substring(0, 6);
    37. },
    38. 'singleB': function (val) {
    39. return val.substring(1, 5);
    40. },
    41. 'param': function (val, start, end) {
    42. return val.substring(start, end);
    43. }
    44. }
    45. })
    46. script>
    47. html>

    2、全局过滤器

    1. Vue.filter('filterName', function (value) {
    2.  // value 表示要过滤的内容
    3. });

    2.1、配置data.js

    1. //给Date类添加了一个新的实例方法format
    2. Date.prototype.format = function (fmt) {
    3. //debugger;
    4. var o = {
    5. "M+": this.getMonth() + 1, //月份
    6. "d+": this.getDate(), //日
    7. "h+": this.getHours(), //小时
    8. "m+": this.getMinutes(), //分
    9. "s+": this.getSeconds(), //秒
    10. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    11. "S": this.getMilliseconds() //毫秒
    12. };
    13. if (/(y+)/.test(fmt))
    14. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    15. for (var k in o)
    16. if (new RegExp("(" + k + ")").test(fmt))
    17. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    18. return fmt;
    19. };
    20. function fmtDate(date, pattern) {
    21. var ts = date.getTime();
    22. var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
    23. if (pattern) {
    24. d = new Date(ts).format(pattern);
    25. }
    26. return d.toLocaleString();
    27. };
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>过滤器title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. <script src="date.js">script>
    9. head>
    10. <body>
    11. <div id="app">
    12. <h3>全局过滤器h3>
    13. {{time}}<br>
    14. {{time | fmtDateFilter}}
    15. div>
    16. body>
    17. <script type="text/javascript">
    18. // 全局过滤器
    19. Vue.filter('fmtDateFilter', function (value) {
    20. return fmtDate(value);
    21. });
    22. // 绑定边界 ES6具体体现
    23. new Vue({
    24. el: '#app',
    25. data() {
    26. return {
    27. time: new Date()
    28. };
    29. }
    30. })
    31. script>
    32. html>

    五、计算属性及监听属性

    1、计算属性

       计算属性可用于快速计算视图(View)中显示的属性。这些计算将被缓存,并且只在需要时更新

       computed:{}

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>计算title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. 单价:<input v-model="price">
    12. 数量:<input v-model="num">
    13. 总价:<input v-model="count">
    14. div>
    15. body>
    16. <script type="text/javascript">
    17. new Vue({
    18. el: '#app',
    19. data() {
    20. return {
    21. price: 79,
    22. num: 1
    23. }
    24. },
    25. computed: {
    26. count: function () {
    27. return this.price * this.num
    28. }
    29. }
    30. })
    31. script>
    32. html>

      

    2、监听属性

       监听属性 watch,我们可以通过 watch 来响应数据的变化

       watch:{}

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>计算属性及监听属性title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    8. head>
    9. <body>
    10. <div id="app">
    11. <p>监听属性p>
    12. 千米:<input v-model="km"/>
    13. 米:<input v-model="m"/>
    14. div>
    15. body>
    16. <script type="text/javascript">
    17. // 绑定边界 ES6具体体现
    18. new Vue({
    19. el: '#app',
    20. data() {
    21. return {
    22. km: 2,
    23. m: 2000
    24. };
    25. },
    26. watch: {
    27. // v指的是m变量
    28. m: function (v) {
    29. this.km = parseInt(v) / 1000;
    30. },
    31. // v指的是km变量
    32. km: function (v) {
    33. this.m = parseInt(v) * 1000;
    34. }
    35. }
    36. })
    37. script>
    38. html>

    3、购物车案例

    利用监听属性和计算属性利用来计算前端的一个案例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>购物车title>
    7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js">script>
    8. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    9. <style>
    10. table {
    11. width: 100%;
    12. border-collapse: collapse;
    13. }
    14. th, td {
    15. padding: 8px;
    16. text-align: left;
    17. border-bottom: 1px solid #ddd;
    18. }
    19. th {
    20. background-color: #f2f2f2;
    21. }
    22. h1, p {
    23. text-align: center;
    24. }
    25. style>
    26. head>
    27. <body>
    28. <h1>购物车h1>
    29. <div id="app">
    30. <table>
    31. <thead>
    32. <tr>
    33. <th>商品名th>
    34. <th>商品价格th>
    35. <th>数量th>
    36. <th>小计th>
    37. tr>
    38. thead>
    39. <tbody>
    40. <tr>
    41. <td>花西币td>
    42. <td>{{hxbDj}}td>
    43. <td>
    44.  <input type="number" v-model="hxb"/> 
    45. td>
    46. <td>{{hxbTotal}}td>
    47. tr>
    48. <tr>
    49. <td>眉笔td>
    50. <td>{{mbDj}}td>
    51. <td>
    52.  <input type="number" v-model="mb"> 
    53. td>
    54. <td>{{mbTotal}}td>
    55. tr>
    56. <tr>
    57. <td>口红td>
    58. <td>{{khDj}}td>
    59. <td>
    60.  <input type="number" v-model="kh"> 
    61. td>
    62. <td>{{khTotal}}td>
    63. tr>
    64. <tr>
    65. <td colspan="3" style="text-align: right;">总计td>
    66. <td>{{total}}td>
    67. tr>
    68. tbody>
    69. table>
    70. div>
    71. body>
    72. <script type="text/javascript">
    73. // 绑定边界 ES6具体体现
    74. new
    75. Vue({
    76. el: '#app',
    77. data() {
    78. return {
    79. hxbDj: 79,
    80. mbDj: 10,
    81. khDj: 299,
    82. hxb: 1,
    83. mb: 1,
    84. kh: 1,
    85. };
    86. },
    87. computed: {
    88. hxbTotal() {
    89. return this.hxbDj * this.hxb;
    90. },
    91. mbTotal() {
    92. return this.mbDj * this.mb;
    93. },
    94. khTotal() {
    95. return this.khDj * this.kh;
    96. },
    97. total() {
    98. return this.hxbTotal + this.mbTotal + this.khTotal;
    99. }
    100. }

    因为我用的输入框的类型是number类型的所以我就没用按钮的点击事件++--了

  • 相关阅读:
    VForm3的文件上传方式
    JavaScript 语法基础
    设计模式——1. 单例模式
    NIO简单介绍
    Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    实例060:字符串长度
    java-初识Servlet,Tomcat,JDBC
    List append 和 += 的区别
    Spring注解处理机制
    Android基础二:常见的几种组件
  • 原文地址:https://blog.csdn.net/weixin_74383330/article/details/132984923