vue2(二)

作者: 看谷秀 | 来源:发表于2023-01-04 15:00 被阅读0次
    目录

    ◆ vue 简介
    ◆ vue 的基本使用
    ◆ vue 的调试工具
    ◆ vue 的指令与过滤器
    ◆ 品牌列表案例

    一 vue 简介
    1. 什么是 vue

    官方给出的概念:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的前端框架。

    2 vue 的特性

    vue 框架的特性,主要体现在如下两方面:

    • ① 数据驱动视图
    • ② 双向数据绑定

    2.1 数据驱动视图

    2.2 双向数据绑定

    2.3 MVVM

    2.4 MVVM 的工作原理

    2.5 vue 的版本

    二 vue 的基本使用
    1. 基本使用步骤
    1. 基本代码与 MVVM 的对应关系
    三 vue 的调试工具
    1. 安装 vue-devtools 调试工具

    vue 官方提供的 vue-devtools 调试工具,能够方便开发者对 vue 项目进行调试与开发。
    Chrome 浏览器在线安装 vue-devtools :
    https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
    FireFox 浏览器在线安装 vue-devtools :
    https://addons.mozilla.org/zh-CN/firefox/addon/vue-js-devtools/

    1. 配置 Chrome 浏览器中的 vue-devtools
    1. 使用 vue-devtools 调试 vue 页面
    四 vue 的指令与过滤器
    1. 指令的概念
    • 指令(Directives)是 vue 为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。
      vue 中的指令按照不同的用途可以分为如下 6 大类:

    \color{red} { 内容渲染} 指令
    \color{red} { 属性绑定} 指令
    \color{red} { 事件绑定} 指令
    \color{red} { 双向绑定} 指令
    \color{red} { 条件渲染} 指令
    \color{red} { 列表渲染} 指令

    注意:指令是 vue 开发中最基础、最常用、最简单的知识点。

    • 1.1 内容渲染指令


    v-text
    • 设置元素内容,如果元素有内容,则会覆盖


    {{ }} 语法
    • 内容占位符


    v-html
    截屏2022-12-28 下午12.38.40.png
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <p v-text="username"></p>
        <p v-text="gender">性别:</p>
    
        <hr>
    
        <p>姓名:{{ username }}</p>
        <p>性别:{{ gender }}</p>
    
        <hr>
    
        <div v-text="info"></div>
        <div>{{ info }}</div>
        <div v-html="info"></div>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            username: 'zhangsan',
            gender: '女',
            info: '<h4 style="color: red; font-weight: bold;">欢迎大家来学习 vue.js</h4>'
          }
        })
      </script>
    </body>
    
    • 1.2 属性绑定指令
    • 属性绑定指令的简写形式
    • 使用 Javascript 表达式
    属性绑定-例子
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <input type="text" :placeholder="tips">
        <hr>
        <!-- vue 规定 v-bind: 指令可以简写为 : -->
        <img :src="photo" alt="" style="width: 150px;">
    
        <hr>
        <div>1 + 2 的结果是:{{ 1 + 2 }}</div>
       
        /* tips字符串用''字符串分割成字符, reverse翻转为字符,用''添加为新的数组*/
        <div>{{ tips }} 反转的结果是:{{ tips.split('').reverse().join('') }}</div>
     
        /*为title属性添加绑定 box字符串+ index拼接的字
    符串*/
        /*这个title属性就是, 悬停标签上面显示的数字*/
        <div :title="'box' + index">这是一个 div</div>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            tips: '请输入用户名',
            photo: 'https://cn.vuejs.org/images/logo.svg',
            index: 3
          }
        })
      </script>
    </body>
    
    • 1.3 事件绑定指令
    • 事件绑定的简写形式
    • 事件参数对象
    • 绑定事件并传参
    事件绑定- 例子
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <p>count 的值是:{{ count }}</p>
        <!-- 在绑定事件处理函数的时候,可以使用 () 传递参数 -->
        <!-- v-on: 指令可以被简写为 @ -->
        <button @click="add(1)">+1</button>
        <button @click="sub">-1</button>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            count: 0
          },
          // methods 的作用,就是定义事件的处理函数
          methods: {
           func: function() {
           },
           func() { // 上面的简写
           },
            add(n) {
              // 在 methods 处理函数中,this 就是 new 出来的 vm 实例对象
              // console.log(vm === this)
              console.log(vm)
              // vm.count += 1
              this.count += n
            },
            sub() {
              // console.log('触发了 sub 处理函数')
              this.count -= 1
            }
          }
        })
      </script>
    </body>
    
    $event
    获取dom元素, 设置颜色
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <p>count 的值是:{{ count }}</p>
        <!-- 如果 count 是偶数,则 按钮背景变成红色,否则,取消背景颜色 -->
        <!-- <button @click="add">+N</button> -->
        <!-- vue 提供了内置变量,名字叫做 $event,它就是原生 DOM 的事件对象 e -->
        <button @click="add($event, 1)">+N</button>
    
        <!-- 不带参数,  DOM 的事件对象 e也可以获取-->
        <button @click="addOne">+NOne</button>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            count: 0
          },
          methods: {
            add(e, n) {
              this.count += n
              console.log(e)
    
              // 判断 this.count 的值是否为偶数
              if (this.count % 2 === 0) {
                // 偶数
                e.target.style.backgroundColor = 'red'
              } else {
                // 奇数
                e.target.style.backgroundColor = ''
              }
            },
            addOne(e) {
              /*addOne不带参数时候, 默认的e就是事件对象*/
              /*e.target 为Dom元素*/
              this.count += 1
              console.log(e)
    
              // 判断 this.count 的值是否为偶数
              if (this.count % 2 === 0) {
                // 偶数
                e.target.style.backgroundColor = 'red'
              } else {
                // 奇数
                e.target.style.backgroundColor = ''
              }
            }
          },
        })
      </script>
    </body>
    
    事件修饰符
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <a href="http://www.baidu.com" @click.prevent ="show">跳转到百度首页</a>
    
        <hr>
    
        <div style="height: 150px; background-color: orange; padding-left: 100px; line-height: 150px;" @click="divHandler">
          <button @click.stop="btnHandler">按钮</button>
        </div>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {},
          methods: {
            show() {
              // 阻止默认跳转行为
              // event.preventDefault
              console.log('点击了 a 链接')
            },
            btnHandler() {
              console.log('btnHandler')
            },
            divHandler() {
              // 阻止冒泡行为. 点击btn,阻止父类div也会触发事件
              // event.stopPropagation
              console.log('divHandler')
            }
          },
        })
      </script>
    </body>
    
    按键修饰符
    输入框按键修饰符-例子
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <input type="text" @keyup.esc="clearInput" @keyup.enter="commitAjax">
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {},
          methods: {
            // 点击键盘ESC触发
            clearInput(e) {
              console.log('触发了 clearInput 方法')
              e.target.value = ''
            },
            // 点击键盘Enter触发
            commitAjax() {
              console.log('触发了 commitAjax 方法')
            }
          },
        })
      </script>
    
    • 1.4 双向绑定指令

    • 使用v-model 输入框的value和数据源data双向绑定
      value改变 <=> data的username改变

    双向绑定v-model
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
      <div id="app">
        <p>用户的名字是:{{ username }}</p>
        <input type="text" v-model="username">
        <hr>
        <input type="text" :value="username">
        <hr>
        <select v-model="city">
          <option value="">请选择城市</option>
          <option value="1">北京</option>
          <option value="2">上海</option>
          <option value="3">广州</option>
        </select>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            username: 'zhangsan',
            city: '2'
          }
        })
      </script>
    </body>
    
    v-model 指令的修饰符
    双向绑定修饰符
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们把数据填充到 div 内部 -->
      <div id="app">
        <!-- v-model.number 保证input输入的value是number类型,否则 n1 + n2 会变为字符串拼接-->
        <input type="text" v-model.number="n1"> + <input type="text" v-model.number="n2"> = <span>{{ n1 + n2 }}</span>
        <hr>
        <!-- v-model.trim 过滤input输出的value前后的空格 -->
        <input type="text" v-model.trim="username">
        <button @click="showName">获取用户名</button>
        <hr>
        <!-- input失去焦点, 才会调用, 否则实时监听value值 -->
        <input type="text" v-model.lazy="username">
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            username: 'zhangsan',
            n1: 1,
            n2: 2
          },
          methods: {
            showName() {
              console.log(`用户名是:"${this.username}"`)
              // console.log(`用户名是:`,this.username)
            }
          },
        })
      </script>
    </body>
    
    • 1.5 条件渲染指令
    v-if 和 v-show 的区别
    v-else
    v-else-if
    v-if指令
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们把数据填充到 div 内部 -->
      <div id="app">
        <p v-if="flag">这是被 v-if 控制的元素</p>
        <p v-show="flag">这是被 v-show 控制的元素</p>
    
        <hr>
        <div v-if="type === 'A'">优秀</div>
        <div v-else-if="type === 'B'">良好</div>
        <div v-else-if="type === 'C'">一般</div>
        <div v-else>差</div>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            // 如果 flag 为 true,则显示被控制的元素;如果为 false 则隐藏被控制的元素
            flag: true,
            type: 'A'
          }
        })
      </script>
    </body>
    
    • 1.6 列表渲染指令
    v-for 中的索引
    <body>
      <!-- 希望 Vue 能够控制下面的这个 div,帮我们把数据填充到 div 内部 -->
      <div id="app">
        <table class="table table-bordered table-hover table-striped">
          <thead>
            <th>索引</th>
            <th>Id</th>
            <th>姓名</th>
          </thead>
          <tbody>
            <!-- 官方建议:只要用到了 v-for 指令,那么一定要绑定一个 :key 属性 -->
            <!-- 而且,尽量把 id 作为 key 的值 -->
            <!-- 官方对 key 的值类型,是有要求的:字符串或数字类型 -->
            <!-- key 的值是千万不能重复的,否则会终端报错:Duplicate keys detected -->
            <!-- 注意:  v-for使用的当前集 tr也可以使用当然还有其子集-->
            <tr v-for="(item, index) in list" :key="item.id">
              <td>{{ index }}</td>
              <td>{{ item.id }}</td>
              <td>{{ item.name }}</td>
            </tr>
          </tbody>
        </table>
      </div>
    
      <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
      <script src="./lib/vue-2.6.12.js"></script>
      <!-- 2. 创建 Vue 的实例对象 -->
      <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
          // el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
          el: '#app',
          // data 对象就是要渲染到页面上的数据
          data: {
            list: [
              { id: 1, name: '张三' },
              { id: 2, name: '李四' },
              { id: 3, name: '王五' },
              { id: 4, name: '张三' },
            ]
          }
        })
      </script>
    </body>
    
    使用 key 维护列表的状态
    key 的注意事项
    • ① key 的值只能是字符串或数字类型
      ② key 的值必须具有唯一性(即:key 的值不能重复)
      ③ 建议把数据项 id 属性的值作为 key 的值(因为 id 属性的值具有唯一性)
      ④ 使用 index 的值当作 key 的值没有任何意义(因为 index 的值不具有唯一性)
      ⑤ 建议使用 v-for 指令时一定要指定 key 的值(既提升性能、又防止列表状态紊乱)
    key的唯一性
    <body>
      <!-- 在页面中声明一个将要被 vue 所控制的 DOM 区域 -->
      <div id="app">
    
        <!-- 添加用户的区域 -->
        <div>
          <input type="text" v-model="name">
          <button @click="addNewUser">添加</button>
        </div>
    
        <!-- 用户列表区域 -->
        <ul>
          <li v-for="(user, index) in userlist" :key="user.id">
            <input type="checkbox" />
            姓名:{{user.name}}
          </li>
        </ul>
      </div>
    
      <script src="./lib/vue-2.6.12.js"></script>
      <script>
        const vm = new Vue({
          el: '#app',
          data: {
            // 用户列表
            userlist: [
              { id: 1, name: 'zs' },
              { id: 2, name: 'ls' }
            ],
            // 输入的用户名
            name: '',
            // 下一个可用的 id 值
            nextId: 3
          },
          methods: {
            // 点击了添加按钮
            addNewUser() {
              this.userlist.unshift({ id: this.nextId, name: this.name })
              this.name = ''
              this.nextId++
            }
          },
        })
      </script>
    </body>
    
    1. 过滤器
    • 2.1 定义过滤器
    过滤器基本使用
    <body>
      <div id="app">
        <p>message 的值是:{{ message | capi }}</p>
      </div>
    
      <script src="./lib/vue-2.6.12.js"></script>
      <script>
        const vm = new Vue({
          el: '#app',
          data: {
            message: 'hello vue.js'
          },
          // 过滤器函数,必须被定义到 filters 节点之下
          // 过滤器本质上是函数
          filters: {
            // 注意:过滤器函数形参中的 val,永远都是“管道符”前面的那个值
            capi(val) {
              // 字符串有 charAt 方法,这个方法接收索引值,表示从字符串中把索引对应的字符,获取出来
              // val.charAt(0)
              const first = val.charAt(0).toUpperCase()
              // 字符串的 slice 方法,可以截取字符串,从指定索引往后截取
              const other = val.slice(1)
              // 强调:过滤器中,一定要有一个返回值
              return first + other
            }
          }
        })
      </script>
    </body>
    
    • 2.2 私有过滤器和全局过滤器
    <body>
      <div id="app">
        <p>message 的值是:{{ message | capi }}</p>
      </div>
    
      <div id="app2">
        <p>message 的值是:{{ message | capi }}</p>
      </div>
    
      <script src="./lib/vue-2.6.12.js"></script>
      <script>
        // 使用 Vue.filter() 定义全局过滤器
        Vue.filter('capi', function (str) {
          const first = str.charAt(0).toUpperCase()
          const other = str.slice(1)
          return first + other + '~~~'
        })
    
        const vm = new Vue({
          el: '#app',
          data: {
            message: 'hello vue.js'
          },
          // 过滤器函数,必须被定义到 filters 节点之下
          // 过滤器本质上是函数
          filters: {
            // 注意:过滤器函数形参中的 val,永远都是“管道符”前面的那个值
            capi(val) {
              // 字符串有 charAt 方法,这个方法接收索引值,表示从字符串中把索引对应的字符,获取出来
              // val.charAt(0)
              const first = val.charAt(0).toUpperCase()
              // 字符串的 slice 方法,可以截取字符串,从指定索引往后截取
              const other = val.slice(1)
              // 强调:过滤器中,一定要有一个返回值
              return first + other
            }
          }
        })
    
        // ----------------------------------
    
        const vm2 = new Vue({
          el: '#app2',
          data: {
            message: 'heima'
          }
        })
      </script>
    </body>
    
    • 2.3 连续调用多个过滤器
    • 2.4 过滤器传参
    • 2.5 过滤器的兼容性

    过滤器仅在 vue 2.x 和 1.x 中受支持,在 vue 3.x 的版本中剔除了过滤器相关的功能。
    在企业级项目开发中:
    ⚫ 如果使用的是 2.x 版本的 vue,则依然可以使用过滤器相关的功能
    ⚫ 如果项目已经升级到了 3.x 版本的 vue,官方建议使用计算属性或方法代替被剔除的过滤器功能
    具体的迁移指南,请参考 vue 3.x 的官方文档给出的说明:
    https://v3.vuejs.org/guide/migration/filters.html#migration-strategy

    五 品牌列表案例
    案例分析
    <head>
      <title>品牌列表案例</title>
      <link rel="stylesheet" href="./lib/bootstrap.css">
      <link rel="stylesheet" href="./css/brandlist.css">
    </head>
    
    <body>
    
      <div id="app">
        <!-- 卡片区域 -->
        <div class="card">
          <div class="card-header">
            添加品牌
          </div>
          <div class="card-body">
            <!-- 添加品牌的表单区域 -->
            <!-- form 表单元素有 submit 事件 -->
            <form @submit.prevent="add">
              <div class="form-row align-items-center">
                <div class="col-auto">
                  <div class="input-group mb-2">
                    <div class="input-group-prepend">
                      <div class="input-group-text">品牌名称</div>
                    </div>
                    <input type="text" class="form-control" placeholder="请输入品牌名称" v-model.trim="brand">
                  </div>
                </div>
                <div class="col-auto">
                  <button type="submit" class="btn btn-primary mb-2">添加</button>
                </div>
              </div>
            </form>
          </div>
        </div>
    
        <!-- 表格区域 -->
        <table class="table table-bordered table-hover table-striped">
          <thead>
            <tr>
              <th scope="col">#</th>
              <th scope="col">品牌名称</th>
              <th scope="col">状态</th>
              <th scope="col">创建时间</th>
              <th scope="col">操作</th>
            </tr>
          </thead>
          <tbody>
            <tr v-for="item in list" :key="item.id">
              <td>{{ item.id }}</td>
              <td>{{ item.name }}</td>
              <td>
                <div class="custom-control custom-switch">
                  <!-- 使用 v-model 实现双向数据绑定 -->
                  <input type="checkbox" class="custom-control-input" :id="'cb' + item.id" v-model="item.status">
                  <!-- 使用 v-if 结合 v-else 实现按需渲染 -->
                  <label class="custom-control-label" :for="'cb' + item.id" v-if="item.status">已启用</label>
                  <label class="custom-control-label" :for="'cb' + item.id" v-else>已禁用</label>
                </div>
              </td>
              <!-- 过滤器 过滤时间 -->
              <td>{{ item.time | dateFormat }}</td>
              <td>
                <a href="javascript:;" @click="remove(item.id)">删除</a>
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    
      <!-- 只要导入了 dayjs 的库文件,在 window 全局,就可以使用 dayjs() 方法了 -->
      <script src="./lib/dayjs.min.js"></script>
      <script src="./lib/vue-2.6.12.js"></script>
      <script>
        // 声明格式化时间的全局过滤器
        Vue.filter('dateFormat', function (time) {
          // 1. 对 time 进行格式化处理,得到 YYYY-MM-DD HH:mm:ss
          // 2. 把 格式化的结果,return 出去
    
          // 直接调用 dayjs() 得到的是当前时间
          // dayjs(给定的日期时间) 得到指定的日期
          const dtStr = dayjs(time).format('YYYY-MM-DD HH:mm:ss')
          return dtStr
        })
    
        const vm = new Vue({
          el: '#app',
          data: {
            // 用户输入的品牌名称
            brand: '',
            // nextId 是下一个,可用的 id
            nextId: 4,
            // 品牌的列表数据
            list: [
              { id: 1, name: '宝马', status: true, time: new Date() },
              { id: 2, name: '奔驰', status: false, time: new Date() },
              { id: 3, name: '奥迪', status: true, time: new Date() },
            ],
          },
          methods: {
            // 点击链接,删除对应的品牌信息
            remove(id) {
              this.list = this.list.filter(item => item.id !== id)
            },
            // 阻止表单的默认提交行为之后,触发 add 方法
            add() {
              // 如果判断到 brand 的值为空字符串,则 return 出去
              if (this.brand === '') return alert('必须填写品牌名称!')
    
              // 如果没有被 return 出去,应该执行添加的逻辑
              // 1. 先把要添加的品牌对象,整理出来
              const obj = {
                id: this.nextId,
                name: this.brand,
                status: true,
                time: new Date()
              }
              // 2. 往 this.list 数组中 push 步骤 1 中得到的对象
              this.list.push(obj)
              // 3. 清空 this.brand;让 this.nextId 自增 +1
              this.brand = ''
              this.nextId++
            }
          },
        })
      </script>
    </body>
    

    相关文章

      网友评论

          本文标题:vue2(二)

          本文链接:https://www.haomeiwen.com/subject/ozboqdtx.html