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


    前言

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

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

    一,插值

    1.1 文本

              {{msg}}

    1. <body>
    2. <div id="wenben">
    3. <h1>文本h1>
    4. {{msg}}
    5. div>
    6. <script >
    7. new Vue({
    8. el:'#wenben',
    9. data(){
    10. return{
    11. msg:"Hello Smart!"
    12. }
    13. }
    14. });
    15. script>

    1.2 html

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

    1. 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.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="wenben">
    10. <p>html解析p>
    11. <h1 v-html="msg2">h1>
    12. div>
    13. <script >
    14. new Vue({
    15. el:'#wenben',
    16. data(){
    17. return {
    18. msg2:'Hello Smart!'
    19. }
    20. }
    21. });
    22. script>
    23. body>
    24. html>

    1.3 属性

    1. 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.10/vue.js">script>
    7. <style>
    8. .f40{
    9. font-size: 100px;
    10. }
    11. style>
    12. head>
    13. <body>
    14. <div id="wenben">
    15. <p>属性p>
    16. <h1 :class="msg3" v-html="msg2">h1>
    17. div>
    18. <script >
    19. new Vue({
    20. el:'#wenben',
    21. data(){
    22. return {
    23. msg2:'Hello Smart!',
    24. msg3:'f40'
    25. }
    26. }
    27. });
    28. script>
    29. body>
    30. html>

    1.4 表达式

    1. 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.10/vue.js">script>
    7. <style>
    8. .f40{
    9. font-size: 40px;
    10. }
    11. style>
    12. head>
    13. <body>
    14. <div id="wenben">
    15. {{num+10}},
    16. {{warm.substr(9,15)}},
    17. <input v-model="ok"/>
    18. {{ok==1?'被打了':'不行我要还回去'}}
    19. div>
    20. <script >
    21. new Vue({
    22. el:'#wenben',
    23. data(){
    24. return {
    25. // msg1:'Hello Smart!',
    26. // msg2:'Hello Smart!',
    27. // msg3:'f40'
    28. num:10,
    29. warm:'nishigedashuaige',
    30. ok:1
    31. }
    32. }
    33. });
    34. script>
    35. body>
    36. html>

    二,指令

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

    1. 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.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="zz">
    10. <h1>v-if...的使用h1>
    11. <input v-model="yanzhi"/><br/>
    12. <b v-if="yanzhi<60">丑男b>
    13. <b v-else-if="yanzhi>=60 && yanzhi<=70">看得过去b>
    14. <b v-else-if="yanzhi>70 && yanzhi<=80">小帅b>
    15. <b v-else-if="yanzhi>80 && yanzhi<=90">美男子b>
    16. <b v-else=" ">吴彦祖b>
    17. div>
    18. body>
    19. <script type="text/javascript">
    20. // 构建vue实例 绑定边界
    21. new Vue({
    22. el:'#zz',
    23. data(){
    24. return{
    25. yanzhi:60,
    26. }
    27. },
    28. })
    29. script>
    30. body>
    31. html>

    2.v-show

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

    1. 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.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="zz">
    10. <h1>v-if|v-else|v-else-if的使用h1>
    11. <input v-model="yanzhi"/><br/>
    12. <b v-if="yanzhi<60">丑男b>
    13. <b v-else-if="yanzhi>=60 && yanzhi<=70">看得过去b>
    14. <b v-else-if="yanzhi>70 && yanzhi<=80">小帅b>
    15. <b v-else-if="yanzhi>80 && yanzhi<=90">美男子b>
    16. <b v-else=" ">吴彦祖b>
    17. <p v-show="yanzhi>90">>v-show-成为大神的人p>
    18. <p v-if="yanzhi>90">v-if-成为大神的人<p>
    19. div>
    20. body>
    21. <script type="text/javascript">
    22. // 构建vue实例 绑定边界
    23. new Vue({
    24. el:'#zz',
    25. data(){
    26. return{
    27. yanzhi:60,
    28. }
    29. },
    30. })
    31. script>
    32. body>
    33. html>

    3 v-for

    类似JS的遍历:

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

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

    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. <h1>v-for的使用h1>
    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. // 绑定边界
    24. new Vue({
    25. el: '#app',
    26. data() {
    27. return {
    28. hobby: [
    29. {id: "1", name: "一杀"},
    30. {id: "2", name: "二杀"},
    31. {id: "3", name: "三杀"},
    32. {id: "4", name: "四杀"}
    33. ]
    34. };
    35. }
    36. })
    37. script>
    38. html>

    4 动态参数:

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

        ...

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

     

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

    1. 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.10/vue.js">script>
    7. head>
    8. <div id="app">
    9. <h1>动态参数h1>
    10. <input v-model="evname" />
    11. <button v-on:[evname]="test">点击button>
    12. div>
    13. <script type="text/javascript">
    14. // 构建vue实例 绑定边界
    15. new Vue({
    16. el:'#app',
    17. data(){
    18. return{
    19. evname:'click'
    20. };
    21. },
    22. methods: {
    23. test(){
    24. alert("点一点更棒!");
    25. }
    26. }
    27. })
    28. script>
    29. html>

    三,过滤器

    3.1 局部过滤器

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

    1. 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.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="B">
    10. {{msg}}<br />
    11. {{msg|single}}<br />
    12. {{msg|param(0,2)}}
    13. div>
    14. <script type="text/javascript">
    15. // 绑定边界 ES6具体体现
    16. new Vue({
    17. el: '#B',
    18. data() {
    19. return {
    20. msg: "或许就像他们说~"
    21. };
    22. },
    23. filters: {
    24. 'single': function(val) {
    25. return val.substring(4, 8);
    26. },
    27. 'param': function(val, start, end) {
    28. return val.substring(start, end);
    29. }
    30. }
    31. })
    32. script>
    33. body>
    34. html>

    3.2 全局过滤器

    拷入date.js(日期格式化)放入项目js目录中,在页面中引入。
    定义全局过滤器 

    1. 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.10/vue.js">script>
    7. <script src="date.js">script>
    8. head>
    9. <body>
    10. <div id="B">
    11. <h3>全局过滤器h3>
    12. {{time}}<br>
    13. {{time | fmtDateFilter}}
    14. div>
    15. body>
    16. <script type="text/javascript">
    17. // 全局过滤器
    18. Vue.filter('fmtDateFilter', function (value) {
    19. return fmtDate(value);
    20. });
    21. // 绑定边界 ES6具体体现
    22. new Vue({
    23. el: '#B',
    24. data() {
    25. return {
    26. time: new Date()
    27. };
    28. }
    29. })
    30. script>
    31. html>

    四,计算属性&监听器

    4.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/vue/2.6.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="B">
    10. 单价:<input v-model="price">
    11. 数量:<input v-model="num">
    12. 总价:<input v-model="count">
    13. div>
    14. body>
    15. <script type="text/javascript">
    16. new Vue({
    17. el: '#B',
    18. data() {
    19. return {
    20. price: 50,
    21. num: 1
    22. }
    23. },
    24. computed: {
    25. count: function () {
    26. return this.price * this.num
    27. }
    28. }
    29. })
    30. script>
    31. html>

    4.2 监听器

    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/vue/2.6.10/vue.js">script>
    7. head>
    8. <body>
    9. <div id="B">
    10. <p>监听属性p>
    11. 千米:<input v-model="km"/>
    12. 米:<input v-model="m"/>
    13. div>
    14. body>
    15. <script type="text/javascript">
    16. // 绑定边界 ES6具体体现
    17. new Vue({
    18. el: '#B',
    19. data() {
    20. return {
    21. km: 2,
    22. m: 2000
    23. };
    24. },
    25. watch: {
    26. // v指的是m变量
    27. m: function (v) {
    28. this.km = parseInt(v) / 1000;
    29. },
    30. // v指的是km变量
    31. km: function (v) {
    32. this.m = parseInt(v) * 1000;
    33. }
    34. }
    35. })
    36. script>
    37. html>

    五、购物车实现

    购物车代码:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    6. <title>购物车title>
    7. <style>
    8. th, td {
    9. padding: 15px;
    10. text-align: center;
    11. }
    12. style>
    13. head>
    14. <body>
    15. <div id="B">
    16. <div >
    17. <h1>购物车h1>
    18. <table width="80%" border="1" cellspacing="1" cellpadding="1">
    19. <thead>
    20. <tr>
    21. <th>商品名th>
    22. <th>数量th>
    23. <th>单价th>
    24. <th>小计th>
    25. tr>
    26. thead>
    27. <tbody>
    28. <tr v-for="item in items" :key="item.id">
    29. <td >
    30. <h3 class="">{{ item.name }}h3>
    31. td>
    32. <td class="">
    33. <button @click="updatetity(item, -1)">-button>
    34. <span class="quantity-label">{{ item.quantity }}span>
    35. <button @click="updatetity(item, 1)">+button>
    36. td>
    37. <td class="">{{ item.price }}td>
    38. <td>
    39. <p class="">{{ subtotal(item) }}p>
    40. td>
    41. tr>
    42. tbody>
    43. <tfoot>
    44. <tr>
    45. <td colspan="3">td>
    46. <td>
    47. <p class="" colspan="4" sty>总计{{ count() }}p>
    48. td>
    49. tr>
    50. tfoot>
    51. center>
    52. table>
    53. div>
    54. div>
    55. <script>
    56. new Vue({
    57. el: '#B',
    58. data: {
    59. items: [
    60. { id: 1, name: '乒乓球', price: '$2', quantity: 1 },
    61. { id: 2, name: '足球', price: '$109', quantity: 2 },
    62. { id: 3, name: '篮球', price: '$150', quantity: 1 },
    63. { id: 4, name: '羽毛球', price: '$99', quantity: 2 },
    64. ]
    65. },
    66. methods: {
    67. updatetity(item, amount) {
    68. item.quantity += amount;
    69. },
    70. subtotal(item) {
    71. return '$' + (parseFloat(item.price.slice(1)) * item.quantity).toFixed(2);
    72. },
    73. count() {
    74. let total = 0;
    75. for (let item of this.items) {
    76. total += parseFloat(item.price.slice(1)) * item.quantity;
    77. }
    78. return '$' + total.toFixed(2);
    79. }
    80. }
    81. });
    82. script>
    83. body>
    84. html>
  • 相关阅读:
    数学建模笔记-第七讲-回归分析
    Cloud-Eureka服务治理-Ribbon负载均衡
    驱动开发:内核枚举Registry注册表回调
    Java面试题总结(一)
    AlmaLinux正开发成为不包含RHEL代码但兼容RHEL的发行版本
    2022年是SEO行业凋谢的一年
    Python机器学习015:pytorch快速入门
    苹果急了,Type-C将一统天下,欧盟法案有望今年实现
    Meta Learning
    Hadoop第五章:序列化
  • 原文地址:https://blog.csdn.net/m0_73192864/article/details/132986160