Vue基础之模板语法介绍

简介: Vue基础之模板语法介绍

前言

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

一、插值

       1.1、文本

       1.2、html

       1.3、属性

       1.4、class、style绑定

       1.5、表达式

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

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

<p>{{ message }}</p>

上面的代码将把Vue实例中的message属性的值插入到<p>元素中。

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

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

上面的代码将把message属性的值转换为大写后插入到<p>元素中。

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

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

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

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

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

案例:

完整代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>插值</title>
    <!-- 引入vue.js的依赖 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
  </head>
  <body>
    <!-- 定义边界 -->
    <div id="app">
      <h1>{{msg}}</h1>
      <h6>{{msg}}</h6>
      <h3>演示适用html样式</h3>
      <div v-html="htmlstr"></div>
      <h3>演示vue 中的属性值</h3>
      <input type="text" v-bind:value="val" />
      <h3>演示Class与style绑值</h3>
      <span :class="f200" v-bind:style="colorblue">二者合为一体</span>
      <h3>演示表达式</h3>
      {{str.substr((0,5))}}<br />
      月薪:{{number-2000}}<br />
      {{ok ? '好' : '不好'}}<br />
      <span :id="id+'id'">商品id</span>
    </div>
  </body>
  <script>
    // 绑定边界
    new Vue({
      el: '#app',
      data() {
        return {
          msg: '七里香的名字很美',
          htmlstr: '<span style="color:red;">雨水</span>',
          val: '输入的值',
          str: '人生苦短,我用Java',
          number: 19999,
          ok: false,
          id: 'goods_',
          colorblue: 'color: blue;',
          f200: 'f200'
        }
      }
    })
  </script>
</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插入到<div>元素之中。

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

上述代码中,message变量的值将会作为<p>元素的文本内容。

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

区别v-if与v-show?

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

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

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

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

区别总结:

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

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

案例:

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>指令</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
  </head>
  <body>
    <!-- 定义边界 -->
    <div id="app">
        <h3>演示v-if 使用</h3>
      请输入成绩:1-100 <input type="text" v-model="degree" style="color: red;" />
      <div v-if="degree<=60">等级E</div>
      <div v-else-if="degree<=70">等级D</div>
      <div v-else-if="degree<=80">等级C</div>
      <div v-else-if="degree<=90">等级B</div>
      <div v-else-if="degree<=100">等级A</div>
      <div v-else="">输入成绩不合法</div>
       <h3>演示v-show 与 v-if区别</h3>
      <div v-show="ok">show</div>
      <div v-if="ok">if</div>
      <h3>演示v-for</h3>
      <select>
        <option v-for="h in hobby" :value="h.id">{{h.name}}</option>
      </select>
      <div v-for="h in hobby">
        <input :value="h.id" type=checkbox />{{h.name}}
      </div>
    </div>
  </body>
  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          degree: 78,
          ok: false,
          hobby: [{
              id: "1",
              name: "乒乓球"
            },
            {
              id: "2",
              name: "滑板"
            },
            {
              id: "3",
              name: "跑步"
          }
            ],
        };
      }
    })
  </script>
</html>

4、动态参数

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

 <a v-bind:[attrname]="url"> ... </a>

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

<button v-on:[evname]="dt">点击事件</button>

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

 

<script type="text/javascript">
    new Vue({
        el: '#app',
        data() {
            return {
                val: "click"
            };
        },
        methods: {
            chc() {
                alert("888");
            }
        }
    })
</script>

三、过滤器

 

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

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

全局过滤器的注册示例:

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

局部过滤器的注册示例:

new Vue({
  // ...
  filters: {
    filterName(value) {
      // 过滤器的逻辑处理
      return formattedValue;
    }
  }
});

过滤器函数的示例:

// 全局过滤器函数
Vue.filter('filterName', function(value, arg1, arg2) {
  // 逻辑处理
  return formattedValue;
});
// 局部过滤器函数
new Vue({
  // ...
  filters: {
    filterName(value, arg1, arg2) {
      // 逻辑处理
      return formattedValue;
    }
  }
});

3.1局部过滤器

new Vue({

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

});

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

<!-- 在两个大括号中 -->

<p>{{ message | filterName }}</p>

{{ name | capitalize }}

<!-- 在 v-bind 指令中 -->

<div v-bind:id="rawId | formatId"></div>

案例:

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>过滤器</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    <script src="data.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
  </head>
  <body>
    <div id="app">
      未使用过滤器:{{msg}}<br />
      使用一个过滤器:{{msg|jubu}}<br />
      使用一个过滤器:{{msg|single}}<br />
      使用过滤器链:{{msg|jubu|single}}<br />
      使用一个过滤器:{{msg|param(4,5)}}<br />
    </div>
  </body>
  <script>
    Vue.filter('jubu', function(val) { //val指的是作用的对象--msg
      return val.substring(2, 8);
    });
    new Vue({
      el: '#app',
      data() {
        return {
          msg: '前端过滤器的使用'
        }
      },
      methods: {
        handle() {
          alert("触发事件");
        }
      },
      filters: {
        'single': function(val) {
          return val.substring(2, 3);
        },
        'param': function(val, start, end) {
          return val.substring(start, end);
        }
      }
    })
  </script>
</html>

3.2全局过滤器

Vue.filter('filterName', function (value) {

// value 表示要过滤的内容

});

使用注意事项:

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

案例:

代码:

data.js

//给Date类添加了一个新的实例方法format
Date.prototype.format = function (fmt) {
  //debugger;
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};
function fmtDate(date, pattern) {
  var ts = date.getTime();
    var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
    if (pattern) {
        d = new Date(ts).format(pattern);
    }
    return d.toLocaleString();
};

具体代码:

<div id="app">
      未使用全局过滤器:{{msg}}<br/>
      使用全局过滤器:{{msg|all}}<br/>
    </div>
      <script type="text/javascript">
        // 全局过滤器
            Vue.filter('all', function(val) {//val指的是作用的对象--msg
              return fmtDate(val);
            });
        new Vue({
          el: '#app',
          data(){
            return{
              msg:new Date()
            }
          }
          })
      </script>

四、计算属性和监听属性

4.1计算属性

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

  computed:{}

语法:

<div id="app">
      单价:<input v-model="price">
      数量:<input v-model="num">
      总价:<input v-model="count">
    </div>
  <script type="text/javascript">
    new Vue({
      el: '#app',
      data(){
        return{
          price:20,
          num:1
        }
      },
       computed:{
         count:function(){
           return this.price*this.num
         }
       }
    })
  </script>

效果:

4.2.监听属性

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

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

语法:

<div id="app">
        千米:<input v-model="km"><br>
        米:<input v-model="m">
      </div>
    <script type="text/javascript">
      new Vue({
        el: '#app',
        data(){
          return{
            m:1000,
            km:1
          }
        },
          watch:{
            // v指的是m变量
            m: function(v){
                this.km = parseInt(v)/1000;
            },
            // v指的是km变量
           km: function(v){
                this.m = parseInt(v)*1000;
            }
          }
      })
    </script>

效果:

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

计算属性:

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

监听属性:

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

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

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

五、vue实现购物车案例

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

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

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

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

 

<script type="text/javascript">
    new Vue({
      el: '#app',
      data(){
        return{
          price:9.9,
          num:2
        }
      },
       computed:{
         count:function(){
           return this.price*this.num
         }
       }
    })
  </script>
相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
6天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
6天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
11天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
15 2
|
11天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
14 2
|
11天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
13天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
13天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
31 9
|
12天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
12天前
|
JavaScript 前端开发 UED
vue 提高 tree shaking 的效果
【10月更文挑战第23天】提高 Vue 中 Tree shaking 的效果需要综合考虑多个因素,包括模块的导出和引用方式、打包工具配置、代码结构等。通过不断地优化和调整,可以最大限度地发挥 Tree shaking 的优势,为 Vue 项目带来更好的性能和用户体验。
下一篇
无影云桌面