• Vue基础之模板语法介绍


                                                                    目录

    前言

    一、插值

    二、指令

    三、过滤器

    四、计算属性和监听属性

    五、vue实现购物车案例


    前言

    上篇我分享了关于Vue的入门,简单的入了个门。本篇文章将要分享的内容为Vue的模板语法。

    一、插值

            1.1、文本

            1.2、html

            1.3、属性

            1.4、class、style绑定

            1.5、表达式

    在Vue的模板语法中,插值是一种常用的方式来动态地将数据渲染到视图中Vue使用双大括号{{}}作为插值的语法标记。

    最简单的用法是在模板中直接插入数据值,例如:

    1. <p>{{ message }}p>

    上面的代码将把Vue实例中的message属性的值插入到

    元素中。

    插值还支持JavaScript表达式,你可以在插值中使用表达式来执行计算或调用函数,例如:

    1. <p>{{ message.toUpperCase() }}p>

    上面的代码将把message属性的值转换为大写后插入到

    元素中。

    另外,插值还可以用在HTML属性中,例如:

    <a v-bind:href="url">{{ linkText }}</a>
    

    上面的代码使用v-bind指令将url属性的值绑定到元素的href属性上,并将linkText属性的值插入到元素中显示的文本内容中。

    需要注意的是,在插值中不能使用括号或赋值语句,因为插值只接受单个表达式。

    总结起来,Vue的模板语法中的插值提供了一种简洁而灵活的方式来将数据动态地渲染到视图中可以直接插入数据值,也可以使用JavaScript表达式进行计算和函数调用。此外,插值还可以用在HTML属性中。

    案例:

    完整代码:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>插值</title>
    6. <!-- 引入vue.js的依赖 -->
    7. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 定义边界 -->
    11. <div id="app">
    12. <h1>{{msg}}</h1>
    13. <h6>{{msg}}</h6>
    14. <h3>演示适用html样式</h3>
    15. <div v-html="htmlstr"></div>
    16. <h3>演示vue 中的属性值</h3>
    17. <input type="text" v-bind:value="val" />
    18. <h3>演示Class与style绑值</h3>
    19. <span :class="f200" v-bind:style="colorblue">二者合为一体</span>
    20. <h3>演示表达式</h3>
    21. {{str.substr((0,5))}}<br />
    22. 月薪:{{number-2000}}<br />
    23. {{ok ? '好' : '不好'}}<br />
    24. <span :id="id+'id'">商品id</span>
    25. </div>
    26. </body>
    27. <script>
    28. // 绑定边界
    29. new Vue({
    30. el: '#app',
    31. data() {
    32. return {
    33. msg: '七里香的名字很美',
    34. htmlstr: '雨水',
    35. val: '输入的值',
    36. str: '人生苦短,我用Java',
    37. number: 19999,
    38. ok: false,
    39. id: 'goods_',
    40. colorblue: 'color: blue;',
    41. f200: 'f200'
    42. }
    43. }
    44. })
    45. </script>
    46. </html>

    二、指令


    核心指令

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

     v-if|v-else|v-else-if:根据其后表达式的bool值进行判断是否渲染该元素

    他们只能是兄弟元素

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

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

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

      v-for类似JS的遍历,

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

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

     v-model:用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值   

    v-for/v-model一起绑定[多选]复选框和单选框
     

    1. v-bind插值:v-bind指令用于在HTML属性中插入动态的数据。可以简写为:
    <img :src="imageSrc">
    

    上述代码中,:src将会把imageSrc变量的值作为src属性的值进行插值。

    1. v-on插值:v-on指令用于在HTML事件处理程序中插入动态的方法。可以简写为@
    <button @click="handleClick">Click Me</button>
    

    上述代码中,@click将会将handleClick方法插入到click事件处理程序中。

    1. v-html插值:v-html指令用于将数据作为原始HTML插入到元素中。
    <div v-html="htmlString"></div>
    

    上述代码中,htmlString变量的值将会被作为原始HTML插入到

    元素之中。

    1. v-text插值:v-text指令用于替代双大括号插值,将指定的数据直接作为文本内容插入到元素中。
    <p v-text="message"></p>
    

    上述代码中,message变量的值将会作为

    元素的文本内容。

    注意重点:面试考题!!!

    区别v-if与v-show?

    1. v-if
      v-if指令根据条件表达式的值来控制元素的存在与否。当条件为true时,元素会被添加到DOM中;当条件为false时,元素会被从DOM中移除。它是惰性的,在条件变为true时才会进行渲染,可以避免不必要的DOM操作。
    <div v-if="isShown">This is shown</div>
    

    isShowntrue时,

    元素会被渲染到视图中;当isShownfalse时,
    元素不会被渲染。

    1. v-show
      v-show指令根据条件表达式的值来控制元素的显示或隐藏,但不会对DOM结构进行改变。当条件为true时,元素会以CSS的方式进行展示;当条件为false时,元素会以CSS的方式隐藏。即使在条件为false时,元素仍然存在于DOM中,只是在视觉上被隐藏了。
    <div v-show="isShown">This is shown</div>
    

    isShowntrue时,

    元素会以可见的方式展示;当isShownfalse时,
    元素通过display: none隐藏,但仍然在DOM中存在。

    区别总结:

    • v-if:根据条件决定元素是否存在于DOM中,惰性渲染。
    • v-show:根据条件决定元素的显示与隐藏,通过CSS控制。

    一般而言,如果需要在条件变化频繁的情况下切换元素的显示与隐藏,或者初始渲染时元素可能不会被显示的情况下,推荐使用v-show。而如果需要在条件改变时有更高的渲染开销,或避免初始化时不必要的渲染,使用v-if更为合适。

    案例:

    代码:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>指令</title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 定义边界 -->
    10. <div id="app">
    11. <h3>演示v-if 使用</h3>
    12. 请输入成绩:1-100 <input type="text" v-model="degree" style="color: red;" />
    13. <div v-if="degree<=60">等级E</div>
    14. <div v-else-if="degree<=70">等级D</div>
    15. <div v-else-if="degree<=80">等级C</div>
    16. <div v-else-if="degree<=90">等级B</div>
    17. <div v-else-if="degree<=100">等级A</div>
    18. <div v-else="">输入成绩不合法</div>
    19. <h3>演示v-show 与 v-if区别</h3>
    20. <div v-show="ok">show</div>
    21. <div v-if="ok">if</div>
    22. <h3>演示v-for</h3>
    23. <select>
    24. <option v-for="h in hobby" :value="h.id">{{h.name}}</option>
    25. </select>
    26. <div v-for="h in hobby">
    27. <input :value="h.id" type=checkbox />{{h.name}}
    28. </div>
    29. </div>
    30. </body>
    31. <script>
    32. new Vue({
    33. el: '#app',
    34. data() {
    35. return {
    36. degree: 78,
    37. ok: false,
    38. hobby: [{
    39. id: "1",
    40. name: "乒乓球"
    41. },
    42. {
    43. id: "2",
    44. name: "滑板"
    45. },
    46. {
    47. id: "3",
    48. name: "跑步"
    49. }
    50. ],
    51. };
    52. }
    53. })
    54. </script>
    55. </html>

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

      ...

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

     

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

    1. <script type="text/javascript">
    2. new Vue({
    3. el: '#app',
    4. data() {
    5. return {
    6. val: "click"
    7. };
    8. },
    9. methods: {
    10. chc() {
    11. alert("888");
    12. }
    13. }
    14. })
    15. script>

    三、过滤器


     

    Vue.js中,过滤器(Filters)是一种用于格式化文本输出的特殊函数。它可以应用于绑定表达式中的数据,在渲染过程中将数据转换为所需的格式。以下是过滤器的详细使用方法:

    1. 注册过滤器:
      在Vue实例或组件中,可以通过filters选项来注册过滤器。过滤器可以是全局的(注册在Vue实例上)或局部的(注册在组件上)。

    全局过滤器的注册示例:

    1. Vue.filter('filterName', function(value) {
    2. // 过滤器的逻辑处理
    3. return formattedValue;
    4. });

    局部过滤器的注册示例:

    1. new Vue({
    2. // ...
    3. filters: {
    4. filterName(value) {
    5. // 过滤器的逻辑处理
    6. return formattedValue;
    7. }
    8. }
    9. });

    过滤器函数的示例:

    1. // 全局过滤器函数
    2. Vue.filter('filterName', function(value, arg1, arg2) {
    3. // 逻辑处理
    4. return formattedValue;
    5. });
    6. // 局部过滤器函数
    7. new Vue({
    8. // ...
    9. filters: {
    10. filterName(value, arg1, arg2) {
    11. // 逻辑处理
    12. return formattedValue;
    13. }
    14. }
    15. });

    3.1局部过滤器

    new Vue({
     filters:{'filterName':function(value){}}

    });

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

    1. <p>{{ message | filterName }}p>

    {{ name | capitalize }}

    案例:

    代码:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>过滤器</title>
    6. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    7. <script src="data.js"></script>
    8. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
    9. </head>
    10. <body>
    11. <div id="app">
    12. 未使用过滤器:{{msg}}<br />
    13. 使用一个过滤器:{{msg|jubu}}<br />
    14. 使用一个过滤器:{{msg|single}}<br />
    15. 使用过滤器链:{{msg|jubu|single}}<br />
    16. 使用一个过滤器:{{msg|param(4,5)}}<br />
    17. </div>
    18. </body>
    19. <script>
    20. Vue.filter('jubu', function(val) { //val指的是作用的对象--msg
    21. return val.substring(2, 8);
    22. });
    23. new Vue({
    24. el: '#app',
    25. data() {
    26. return {
    27. msg: '前端过滤器的使用'
    28. }
    29. },
    30. methods: {
    31. handle() {
    32. alert("触发事件");
    33. }
    34. },
    35. filters: {
    36. 'single': function(val) {
    37. return val.substring(2, 3);
    38. },
    39. 'param': function(val, start, end) {
    40. return val.substring(start, end);
    41. }
    42. }
    43. })
    44. </script>
    45. </html>

    3.2全局过滤器

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

    });

    使用注意事项:

    • 过滤器函数接受表达式的值作为第一个参数
    • 过滤器应该是无状态的,即对于相同的输入应该始终返回相同的输出,不应该改变原始数据。语法:{{ message | filterA | filterB }}
    • 过滤器可以串联使用,后一个过滤器的输出作为前一个过滤器的输入。
    • 过滤器可以使用在v-bind指令中,用于动态绑定属性值。
    • 过滤器是JavaScript函数,因此可以接受参数:{{ message | filterA('arg1', arg2) }}

    • js定义一个类

      1. function Stu(){};
      2. Stu.prototype.add(a,b){};//添加一个新的实例方法
      3. Stu.update(a,b){};//添加一个新的类方法 

    案例:

    代码:

    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. <div id="app">
    2. 未使用全局过滤器:{{msg}}<br/>
    3. 使用全局过滤器:{{msg|all}}<br/>
    4. </div>
    5. <script type="text/javascript">
    6. // 全局过滤器
    7. Vue.filter('all', function(val) {//val指的是作用的对象--msg
    8. return fmtDate(val);
    9. });
    10. new Vue({
    11. el: '#app',
    12. data(){
    13. return{
    14. msg:new Date()
    15. }
    16. }
    17. })
    18. </script>

    四、计算属性和监听属性

    4.1计算属性

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

       computed:{}

    语法:

    1. <div id="app">
    2. 单价:<input v-model="price">
    3. 数量:<input v-model="num">
    4. 总价:<input v-model="count">
    5. </div>
    6. <script type="text/javascript">
    7. new Vue({
    8. el: '#app',
    9. data(){
    10. return{
    11. price:20,
    12. num:1
    13. }
    14. },
    15. computed:{
    16. count:function(){
    17. return this.price*this.num
    18. }
    19. }
    20. })
    21. </script>

    效果:

    4.2.监听属性

     watch可以监听简单属性值及其对象中属性值的变化

    ​ watch类似于onchange事件,可以在属性值修改的时候,执行某些操作

    语法:

    1. <div id="app">
    2. 千米:<input v-model="km"><br>
    3. 米:<input v-model="m">
    4. </div>
    5. <script type="text/javascript">
    6. new Vue({
    7. el: '#app',
    8. data(){
    9. return{
    10. m:1000,
    11. km:1
    12. }
    13. },
    14. watch:{
    15. // v指的是m变量
    16. m: function(v){
    17. this.km = parseInt(v)/1000;
    18. },
    19. // v指的是km变量
    20. km: function(v){
    21. this.m = parseInt(v)*1000;
    22. }
    23. }
    24. })
    25. </script>

    效果:

    对比计算属性和监听属性区别:

    计算属性:

    1. 定义:计算属性是基于依赖的数据动态生成的属性,通过在Vue实例中定义computed选项来创建。
    2. 特点:
    • 计算属性具有缓存,即只有相关的依赖发生变化时,它们才会重新计算,否则会直接返回缓存结果,避免不必要的计算。
    • 计算属性是响应式的,当依赖的数据发生变化时,与该计算属性相关的视图会自动重新渲染。
    • 计算属性可以通过在模板中像绑定普通属性一样使用,不需要在模板中添加函数调用语法。

    监听属性:

    1. 定义:监听属性通过在Vue实例中定义watch选项来创建,它监听指定的数据变化并执行相应的回调函数。
    2. 特点:
      • 监听属性不会缓存结果,而是在依赖数据变化时立即执行回调函数。
      • 监听属性可以监听一个或多个数据的变化,当其中任何一个被修改时,都会触发回调函数。
      • 监听属性适用于数据变化后需要执行异步操作或复杂计算的场景。

    计算属性:它用于响应式地更新数据,只要依赖的数据发生变化,该属性就会重新计算,计算的结果改变不可以影响前面的输入。

    监听属性:二者相互依赖,一方改变,对方也相应更改。

    五、vue实现购物车案例

    通过今天的学习,我们可以用计算属性的方式去完成数量递增递减随之总价格也会发生改变的案例。

    先看看以前我们使用的 jQuery方式实现购物车的功能,非常复杂,尤其是我们嵌套样式多的时候,那真的非常难找。以下是我之前写过的前端项目的购物车功能效果。

    我使用vue来实现价格计算:

    核心代码:(原创不易,html代码私信作者可得)
     

    1. <script type="text/javascript">
    2. new Vue({
    3. el: '#app',
    4. data(){
    5. return{
    6. price:9.9,
    7. num:2
    8. }
    9. },
    10. computed:{
    11. count:function(){
    12. return this.price*this.num
    13. }
    14. }
    15. })
    16. </script>

  • 相关阅读:
    Redis_Hash(Map)数据类型基本命令
    跨平台应用开发进阶(二十五) :uni-app实现IOS云打包解决IOS提交审核相册等隐私描述语导致审核失败问题
    如何避免osg绘制场景时因Z冲突导致绘制重影或不正常
    Servlet详解
    JS逆向实战21——某查查webpack密码加密
    【经典面试题-LeetCode134:加油站问题(Java实现)】
    python笔记
    LINUX系统下多进程的创建与通信前后台进程设计
    【EI会议投稿】第三届计算机、人工智能与控制工程国际学术会议 (CAICE 2024)
    XML Encoding = ‘GBK‘ after STRANS,中文乱码
  • 原文地址:https://blog.csdn.net/m0_73647713/article/details/132993209