Vue.js入门模板语法[上] 及Vue.js实现购物车---详细讲解

简介: Vue.js入门模板语法[上] 及Vue.js实现购物车---详细讲解

前言

   前面我们学习了Vue的基础入门,接下来我们学习有关Vue的模板语法,学习Vue语法能提高我们的前端开发效率

 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。vue将模板编译成虚拟dom,结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少

一,插值

1.1 文本

        {{msg}}

<body>
    <div  id="wenben">
      <h1>文本</h1>
       {{msg}}
    </div>
  <script >
    new Vue({
    el:'#wenben',
    data(){
      return{
        msg:"Hello Smart!"
      }
    }
    });
  </script>

1.2 html

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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <div  id="wenben">
       <p>html解析</p>
          <h1 v-html="msg2"></h1>
    </div>
  <script >
    new Vue({
    el:'#wenben',
    data(){
      return {
        msg2:'<span style="color:red;">Hello Smart!</span>'
      }
    }
    });
  </script>
  </body>
</html>

1.3 属性

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
   <style>
    .f40{
      font-size: 100px;
    } 
   </style>
  </head>
  <body>
    <div  id="wenben">
        <p>属性</p>
          <h1 :class="msg3" v-html="msg2"></h1>
    </div>
  <script >
    new Vue({
    el:'#wenben',
    data(){
      return {
          msg2:'<span style="color:red;">Hello Smart!</span>',
           msg3:'f40'
      }
    }
    });
  </script>
  </body>
</html>

1.4 表达式

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
   <style>
    .f40{
      font-size: 40px;
    } 
   </style>
  </head>
  <body>
    <div  id="wenben">
      <!-- <h1>文本</h1> -->
       <!-- {{msg1}} -->
      <!-- <p>html解析</p>
          <h1 v-html="msg2"></h1> -->
       <!-- <p>属性</p>
       <h1 :class="msg3" v-html="msg2"></h1> -->
       <!--表达式-->
       {{num+10}},
       {{warm.substr(9,15)}},
       <input v-model="ok"/>
       {{ok==1?'被打了':'不行我要还回去'}}
    </div>
  <script >
    new Vue({
    el:'#wenben',
    data(){
      return {
        // msg1:'Hello Smart!',
        // msg2:'<span style="color:red;">Hello Smart!</span>',
           // msg3:'f40'
           num:10,
        warm:'nishigedashuaige',
        ok:1
      }
    }
    });
  </script>
  </body>
</html>

二,指令

1.v-if&v-else&v-else-if

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>指令的使用</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <!-- 定义边界 -->
      <div id="zz">
        <h1>v-if...的使用</h1>
        <input v-model="yanzhi"/><br/>
        <b v-if="yanzhi<60">丑男</b>
        <b v-else-if="yanzhi>=60 && yanzhi<=70">看得过去</b>
        <b v-else-if="yanzhi>70 && yanzhi<=80">小帅</b>
        <b v-else-if="yanzhi>80 && yanzhi<=90">美男子</b>
        <b v-else=" ">吴彦祖</b>
      </div>
    </body>
    <script type="text/javascript">
      // 构建vue实例 绑定边界 
      new Vue({
        el:'#zz',
        data(){
          return{
            yanzhi:60,
          }
        },
      })
    </script>
  </body>
</html>

2.v-show

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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>指令的使用</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <!-- 定义边界 -->
      <div id="zz">
        <h1>v-if|v-else|v-else-if的使用</h1>
        <input v-model="yanzhi"/><br/>
        <b v-if="yanzhi<60">丑男</b>
        <b v-else-if="yanzhi>=60 && yanzhi<=70">看得过去</b>
        <b v-else-if="yanzhi>70 && yanzhi<=80">小帅</b>
        <b v-else-if="yanzhi>80 && yanzhi<=90">美男子</b>
        <b v-else=" ">吴彦祖</b>
         <p v-show="yanzhi>90">>v-show-成为大神的人</p> 
         <p v-if="yanzhi>90">v-if-成为大神的人<p>
      </div>
    </body>
    <script type="text/javascript">
      // 构建vue实例 绑定边界 
      new Vue({
        el:'#zz',
        data(){
          return{
            yanzhi:60,
          }
        },
      })
    </script>
  </body>
</html>

3 v-for

类似JS的遍历:

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

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

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>指令</title>
    <!--  jQuery-->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <!--  vue.js-->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<!-- 定义边界 -->
<div id="app">
    <h1>v-for的使用</h1>
    下拉框:
    <select v-model="hobbySelected">
        <option v-for="h in hobby" :value="h.id">{{h.name}}</option>
    </select><br>
    复选框:
    <div v-for="h in hobby">
        <input :value="h.id" type='checkbox'/>{{h.name}}
    </div>
</div>
</body>
<script type="text/javascript">
    // 绑定边界 
    new Vue({
        el: '#app',
        data() {
            return {
                hobby: [
                    {id: "1", name: "一杀"},
                    {id: "2", name: "二杀"},
                    {id: "3", name: "三杀"},
                    {id: "4", name: "四杀"}
                ]
            };
        }
    })
</script>
</html>

4 动态参数:

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

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

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

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

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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>过滤器</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
    <!-- 定义边界 -->
      <div id="app">
        <h1>动态参数</h1>
        <input v-model="evname" />
        <button v-on:[evname]="test">点击</button>
      </div>
    <script type="text/javascript">
      // 构建vue实例 绑定边界 
      new Vue({
        el:'#app',
        data(){
          return{
          evname:'click'
        };
        },
        methods: {
          test(){
            alert("点一点更棒!");
          }
        }
      })
    </script>
</html>

三,过滤器

3.1 局部过滤器

 vue允许自定义过滤器,一般用于常见的文本格式化,过滤器可用的两个地方:双花括号插值v-bind表达式,过滤器应该被添加在js表达式的尾部,使用管道运算符 " | "

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>过滤器的使用</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <!-- 定义边界 -->
    <div id="B">
            {{msg}}<br />
      {{msg|single}}<br />
      {{msg|param(0,2)}}
    </div>
    <script type="text/javascript">
      // 绑定边界 ES6具体体现
      new Vue({
        el: '#B',
        data() {
          return {
            msg: "或许就像他们说~"
          };
        },
        filters: {
          'single': function(val) {
            return val.substring(4, 8);
          },
          'param': function(val, start, end) {
            return val.substring(start, end);
          }
        }
      })
    </script>
  </body>
</html>

3.2 全局过滤器

拷入date.js(日期格式化)放入项目js目录中,在页面中引入。

定义全局过滤器

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>全局过滤器</title>
    <!--  vue.js-->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <script src="date.js"></script>
</head>
<body>
<!-- 定义边界 -->
<div id="B">
    <h3>全局过滤器</h3>
    {{time}}<br>
    {{time | fmtDateFilter}}
</div>
</body>
<script type="text/javascript">
    // 全局过滤器
    Vue.filter('fmtDateFilter', function (value) {
        return fmtDate(value);
    });
    // 绑定边界 ES6具体体现
    new Vue({
        el: '#B',
        data() {
            return {
                time: new Date()
            };
        }
    })
</script>
</html>

四,计算属性&监听器

4.1 计算属性

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

使用场景:当一个属性需要复杂的逻辑运算之后才能获取其值,可以使用计算属性,在一个计算属性中可以完成各种复杂的逻辑,包括运算,方法调用等,只要最终返回一个结果就可以了

语法:computed:{}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算属性</title>
    <!--  vue.js-->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<div id="B">
    单价:<input v-model="price">
    数量:<input v-model="num">
    总价:<input v-model="count">
</div>
</body>
<script type="text/javascript">
    new Vue({
        el: '#B',
        data() {
            return {
                price: 50,
                num: 1
            }
        },
        computed: {
            count: function () {
                return this.price * this.num
            }
        }
    })
</script>
</html>

4.2 监听器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监听属性</title>
    <!--  vue.js-->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
</head>
<body>
<!-- 定义边界 -->
<div id="B">
    <p>监听属性</p>
    千米:<input v-model="km"/>
    米:<input v-model="m"/>
</div>
</body>
<script type="text/javascript">
    // 绑定边界 ES6具体体现
    new Vue({
        el: '#B',
        data() {
            return {
                km: 2,
                m: 2000
            };
        },
        watch: {
            // v指的是m变量
            m: function (v) {
                this.km = parseInt(v) / 1000;
            },
            // v指的是km变量
            km: function (v) {
                this.m = parseInt(v) * 1000;
            }
        }
    })
</script>
</html>

五、购物车实现

购物车代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!--引入vue.js-->
 <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
<title>购物车</title>
<style>
  th, td {
    padding: 15px;
    text-align: center;
  }
</style>
</head>
<body>
<div id="B">
  <div >
    <h1>购物车</h1>
    <table width="80%" border="1"  cellspacing="1" cellpadding="1">
      <thead>
        <tr>
          <th>商品名</th>
          <th>数量</th>
          <th>单价</th>
          <th>小计</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in items" :key="item.id">
          <td >
            <h3 class="">{{ item.name }}</h3>
          </td>
          <td class="">
            <button @click="updatetity(item, -1)">-</button><!-- 绑定事件 -->
            <span class="quantity-label">{{ item.quantity }}</span>
            <button @click="updatetity(item, 1)">+</button>
          </td>
          <td class="">{{ item.price }}</td>
          <td>
            <p class="">{{ subtotal(item) }}</p>
          </td>
        </tr>
      </tbody>
      <tfoot>
        <tr>
          <td colspan="3"></td>
          <td>
            <p class="" colspan="4" sty>总计{{ count() }}</p>
          </td>
        </tr>
      </tfoot>
    </center>
    </table>
  </div>
</div>
<script>
new Vue({
  el: '#B',
  data: {
    items: [
      { id: 1, name: '乒乓球', price: '$2',  quantity: 1 },
      { id: 2, name: '足球', price: '$109', quantity: 2 },
      { id: 3, name: '篮球', price: '$150',  quantity: 1 },
    { id: 4, name: '羽毛球', price: '$99',  quantity: 2 },
    ]
  },
  methods: {
    updatetity(item, amount) {
      item.quantity += amount;
    },
    subtotal(item) {
      return '$' + (parseFloat(item.price.slice(1)) * item.quantity).toFixed(2);
    },
    count() {
      let total = 0;
      for (let item of this.items) {
        total += parseFloat(item.price.slice(1)) * item.quantity;
      }
      return '$' + total.toFixed(2);
    }
  }
});
</script>
</body>
</html>
相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
3天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
115 1
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
41 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
87 10
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
1月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
34 0
|
2月前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
前端开发 JavaScript 设计模式
《JavaScript设计模式》——11.5 代理模板
是的。比如我们将自己的域称为X域,另外的域称为Y域,X域中要有一个被代理页面,即A页面。在A页面中应该具备三个部分,第一个部分是发送请求的模块,如form表单提交,负责向Y域发送请求,并提供额外两组数据,其一是要执行的回调函数名称,其二是X域中代理模板所在的路径,并将target目标指向内嵌框架。
1293 0
|
1月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
25 1
JavaScript中的原型 保姆级文章一文搞懂