导航菜单

  • 0.api
  • 0.Async
  • 0.module
  • 1.ES2015
  • 2.Promise
  • 3.Node
  • 4.NodeInstall
  • 5.REPL
  • 6.NodeCore
  • 7.module&NPM
  • 8.Encoding
  • 9.Buffer
  • 10.fs
  • 11.Stream-1
  • 11.Stream-2
  • 11.Stream-3
  • 11.Stream-4
  • 12-Network-2
  • 12.NetWork-3
  • 12.Network-1
  • 13.tcp
  • 14.http-1
  • 14.http-2
  • 15.compress
  • 16.crypto
  • 17.process
  • 18.yargs
  • 19.cache
  • 20.action
  • 21.https
  • 22.cookie
  • 23.session
  • 24.express-1
  • 24.express-2
  • 24.express-3
  • 24.express-4
  • 25.koa-1
  • 26.webpack-1-basic
  • 26.webpack-2-optimize
  • 26.webpack-3-file
  • 26.webpack-4.tapable
  • 26.webpack-5-AST
  • 26.webpack-6-sources
  • 26.webpack-7-loader
  • 26.webpack-8-plugin
  • 26.webpack-9-hand
  • 26.webpack-10-prepare
  • 28.redux
  • 28.redux-jwt-back
  • 28.redux-jwt-front
  • 29.mongodb-1
  • 29.mongodb-2
  • 29.mongodb-3
  • 29.mongodb-4
  • 29.mongodb-5
  • 29.mongodb-6
  • 30.cms-1-mysql
  • 30.cms-2-mysql
  • 30.cms-3-mysql
  • 30.cms-4-nunjucks
  • 30.cms-5-mock
  • 30.cms-6-egg
  • 30.cms-7-api
  • 30.cms-8-roadhog
  • 30.cms-9-yaml
  • 30.cms-10-umi
  • 30.cms-12-dva
  • 30.cms-13-dva-ant
  • 30.cms-14-front
  • 30.cms-15-deploy
  • 31.dva
  • 31.cms-13-dva-antdesign
  • 33.redis
  • 34.unittest
  • 35.jwt
  • 36.websocket-1
  • 36.websocket-2
  • 38.chat-api-1
  • 38.chat-api-2
  • 38.chat-3
  • 38.chat-api-3
  • 38.chat
  • 38.chat2
  • 38.chat2
  • 39.crawl-0
  • 39.crawl-1
  • 39.crawl-2
  • 40.deploy
  • 41.safe
  • 42.test
  • 43.nginx
  • 44.enzyme
  • 45.docker
  • 46.elastic
  • 47.oauth
  • 48.wxpay
  • index
  • 52.UML
  • 53.design
  • index
  • 54.linux
  • 57.ts
  • 56.react-ssr
  • 58.ts_react
  • 59.ketang
  • 59.ketang2
  • 61.1.devops-linux
  • 61.2.devops-vi
  • 61.3.devops-user
  • 61.4.devops-auth
  • 61.5.devops-shell
  • 61.6.devops-install
  • 61.7.devops-system
  • 61.8.devops-service
  • 61.9.devops-network
  • 61.10.devops-nginx
  • 61.11.devops-docker
  • 61.12.devops-jekins
  • 61.13.devops-groovy
  • 61.14.devops-php
  • 61.15.devops-java
  • 61.16.devops-node
  • 61.17.devops-k8s
  • 62.1.react-basic
  • 62.2.react-state
  • 62.3.react-high
  • 62.4.react-optimize
  • 62.5.react-hooks
  • 62.6.react-immutable
  • 62.7.react-mobx
  • 62.8.react-source
  • 63.1.redux
  • 63.2.redux-middleware
  • 63.3.redux-hooks
  • 63.4.redux-saga
  • 63.5.redux-saga-hand
  • 64.1.router
  • 64.2.router-connected
  • 65.1.typescript
  • 65.2.typescript
  • 65.3.typescript
  • 65.4.antd
  • 65.4.definition
  • 66-1.vue-base
  • 66-2.vue-component
  • 66-3.vue-cli3.0
  • 66-4.$message组件
  • 66-5.Form组件
  • 66-6.tree
  • 66-7.vue-router-apply
  • 66-8.axios-apply
  • 66-9.vuex-apply
  • 66-10.jwt-vue
  • 66-11.vue-ssr
  • 66-12.nuxt-apply
  • 66-13.pwa
  • 66-14.vue单元测试
  • 66-15.权限校验
  • 67-1-network
  • 68-2-wireshark
  • 7.npm2
  • 69-hooks
  • 70-deploy
  • 71-hmr
  • 72.deploy
  • 73.import
  • 74.mobile
  • 75.webpack-1.文件分析
  • 75.webpack-2.loader
  • 75.webpack-3.源码流程
  • 75.webpack-4.tapable
  • 75.webpack-5.prepare
  • 75.webpack-6.resolve
  • 75.webpack-7.loader
  • 75.webpack-8.module
  • 75.webpack-9.chunk
  • 75.webpack-10.asset
  • 75.webpack-11.实现
  • 76.react_optimize
  • 77.ts_ketang_back
  • 77.ts_ketang_front
  • 78.vue-domdiff
  • 79.grammar
  • 80.tree
  • 81.axios
  • 82.1.react
  • 82.2.react-high
  • 82.3.react-router
  • 82.4.redux
  • 82.5.redux_middleware
  • 82.6.connected
  • 82.7.saga
  • 82.8.dva
  • 82.8.dva-source
  • 82.9.roadhog
  • 82.10.umi
  • 82.11.antdesign
  • 82.12.ketang-front
  • 82.12.ketang-back
  • 83.upload
  • 84.graphql
  • 85.antpro
  • 86.1.uml
  • 86.2.design
  • 87.postcss
  • 88.react16-1
  • 89.nextjs
  • 90.react-test
  • 91.react-ts
  • 92.rbac
  • 93.tsnode
  • 94.1.JavaScript
  • 94.2.JavaScript
  • 94.3.MODULE
  • 94.4.EventLoop
  • 94.5.文件上传
  • 94.6.https
  • 94.7. nginx
  • 95.1. react
  • 95.2.react
  • 96.1.react16
  • 96.2.fiber
  • 96.3.fiber
  • 97.serverless
  • 98.websocket
  • 100.1.react-basic
  • 101.1.monitor
  • 101.2.monitor
  • 102.java
  • 103.1.webpack-usage
  • 103.2.webpack-bundle
  • 103.3.webpack-ast
  • 103.4.webpack-flow
  • 103.5.webpack-loader
  • 103.6.webpack-tapable
  • 103.7.webpack-plugin
  • 103.8.webpack-optimize1
  • 103.9.webpack-optimize2
  • 103.10.webpack-hand
  • 103.11.webpack-hmr
  • 103.11.webpack5
  • 103.13.splitChunks
  • 103.14.webpack-sourcemap
  • 103.15.webpack-compiler1
  • 103.15.webpack-compiler2
  • 103.16.rollup.1
  • 103.16.rollup.2
  • 103.16.rollup.3
  • 103.16.vite.basic
  • 103.16.vite.source
  • 103.16.vite.plugin
  • 103.16.vite.1
  • 103.16.vite.2
  • 103.17.polyfill
  • 104.1.binary
  • 104.2.binary
  • 105.skeleton
  • 106.1.react
  • 106.2.react_hooks
  • 106.3.react_router
  • 106.4.redux
  • 106.5.redux_middleware
  • 106.6.connected-react-router
  • 106.6.redux-first-history
  • 106.7.redux-saga
  • 106.8.dva
  • 106.9.umi
  • 106.10.ketang
  • 106.11.antdesign
  • 106.12.antpro
  • 106.13.router-6
  • 106.14.ssr
  • 106.15.nextjs
  • 106.16.1.cms
  • 106.16.2.cms
  • 106.16.3.cms
  • 106.16.4.cms
  • 106.16.mobx
  • 106.17.fomily
  • 107.fiber
  • 108.http
  • 109.1.webpack_usage
  • 109.2.webpack_source
  • 109.3.dll
  • 110.nest.js
  • 111.xstate
  • 112.Form
  • 113.redux-saga
  • 114.react+typescript
  • 115.immer
  • 116.pro5
  • 117.css-loader
  • 118.1.umi-core
  • 119.2.module-federation
  • 119.1.module-federation
  • 120.create-react-app
  • 121.react-scripts
  • 122.react-optimize
  • 123.jsx-runtime
  • 124.next.js
  • 125.1.linux
  • 125.2.linux-vi
  • 125.3.linux-user
  • 125.4.linux-auth
  • 125.5.linux-shell
  • 125.6.linux-install
  • 125.7.linux-system
  • 125.8.linux-service
  • 125.9.linux-network
  • 125.10.nginx
  • 125.11.docker
  • 125.12.ci
  • 125.13.k8s
  • 125.14.k8s
  • 125.15.k8s
  • 125.16.k8s
  • 126.11.react-1
  • 126.12.react-2
  • 126.12.react-3
  • 126.12.react-4
  • 126.12.react-5
  • 126.12.react-6
  • 126.12.react-7
  • 126.12.react-8
  • 127.frontend
  • 128.rollup
  • 129.px2rem-loader
  • 130.health
  • 131.hooks
  • 132.keepalive
  • 133.vue-cli
  • 134.react18
  • 134.2.react18
  • 134.3.react18
  • 135.function
  • 136.toolkit
  • 137.lerna
  • 138.create-vite
  • 139.cli
  • 140.antd
  • 141.react-dnd
  • 142.1.link
  • 143.1.gulp
  • 143.2.stream
  • 143.3.gulp
  • 144.1.closure
  • 144.2.v8
  • 144.3.gc
  • 145.react-router-v6
  • 146.browser
  • 147.lighthouse
  • 148.1.basic
  • 148.2.basic
  • 148.3.basic
  • 148.4.basic
  • 148.5.basic
  • 149.1.vite
  • 149.2.vite
  • 149.3.vite
  • 149.4.vite
  • 150.react-window
  • 151.react-query
  • 152.useRequest
  • 153.transition
  • 154.emotion
  • 155.1.formily
  • 155.2.formily
  • 155.3.formily
  • 155.3.1.mobx.usage
  • 155.3.2.mobx.source
  • 156.vue-loader
  • 103.11.mf
  • 157.1.react18
  • 158.umi4
  • 159.rxjs
  • 159.rxjs2
  • 160.bff
  • 161.zustand
  • 162.vscode
  • 163.emp
  • 164.cors
  • 什么是vue?
  • 什么是库,什么是框架?
  • 初始使用
  • mvc && mvvm
  • 声明式和命令式
  • 模板语法 mustache
  • 观察数据变化
  • 使用proxy实现响应式变化
  • 响应式变化
  • vue实例上常见属性和方法
  • vue中的指令
  • v-for使用
  • 属性绑定 :(v-bind)
  • 绑定事件 @ (v-on)
  • vue的双向绑定 (v-model)
  • 鼠标 键盘事件
  • watch & computed
  • 条件渲染
  • 过滤器的应用 (过滤器中的this都是window)
  • 指令的编写
  • vue中的生命周期
  • 钩子函数中该做的事情
  • vue中的动画
  • 使用animate.css设置动画
  • vue中js动画
  • 使用js动画库
  • 筛选动画

什么是vue? #

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
特点: 易用,灵活,高效 渐进式框架

逐一递增 vue + components + vue-router + vuex + vue-cli

什么是库,什么是框架? #

  • 库是将代码集合成一个产品,库是我们调用库中的方法实现自己的功能。
  • 框架则是为解决一类问题而开发的产品,框架是我们在指定的位置编写好代码,框架帮我们调用。

框架是库的升级版

初始使用 #

new Vue({
    el:'#app',
    template:'<div>我是姜文~~</div>', // 优先使用template
    data:{}
});

mvc && mvvm #

在传统的mvc中除了model和view以外的逻辑都放在了controller中,导致controller逻辑复杂难以维护,在mvvm中view和model没有直接的关系,全部通过viewModel进行交互

声明式和命令式 #

  • 自己写for循环就是命令式 (命令其按照自己的方式得到结果)
  • 声明式就是利用数组的方法forEach (我们想要的是循环,内部帮我们去做)

模板语法 mustache #

允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。在使用数据前需要先声明

  • 编写三元表达式
  • 获取返回值
  • JavaScript 表达式
    <div id="app">
      {{ 1+1 }}
      {{ msg == 'hello'?'yes':'no' }}
      {{ {name:1} }}
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
      let vm = new Vue({
          el:'#app',
          data:{
              msg:'hello'
          }
      })
    </script>

观察数据变化 #

function notify(){
    console.log('视图更新')
}
let data = {
    name:'jw',
    age:18,
    arr:[]
}
// 重写数组的方法
let oldProtoMehtods = Array.prototype;
let proto = Object.create(oldProtoMehtods);
['push','pop','shift','unshift'].forEach(method=>{
    proto[method] = function(){
        notify();
        oldProtoMehtods[method].call(this,...arguments)
    }
})
function observer(obj){
    if(Array.isArray(obj)){
        obj.__proto__ = proto
        return;
    }
    if(typeof obj === 'object'){
        for(let key in obj){
            defineReactive(obj,key,obj[key]);
        }
    }
}
function defineReactive(obj,key,value){
    observer(value); // 再一次循环value
    Object.defineProperty(obj,key,{ // 不支持数组
        get(){
            return value;
        },
        set(val){
            notify();
            observer(val);
            value = val;
        }
    });
}
observer(data);
data.arr.push(1);

使用proxy实现响应式变化 #

let obj = {
    name:{name:'jw'},
    arr:['吃','喝','玩']
}
let handler = {
    get(target,key,receiver){
        if(typeof target[key] === 'object' &&  target[key] !== null){
            return new Proxy(target[key],handler);
        }
        return Reflect.get(target,key,receiver);
    },
    set(target,key,value,receiver){
        if(key === 'length') return true;
        console.log('update')
        return Reflect.set(target,key,value,receiver);
    }
}
let proxy = new Proxy(obj,handler);
proxy.name.name = 'zf';

响应式变化 #

  • 数组的变异方法(不能通过通过长度,索引改变数组)

      <div id="app">
          {{hobbies}}
      </div>
      <script src="node_modules/vue/dist/vue.js"></script>
      <script>
          let vm = new Vue({
              el:'#app',
              data:{
                  hobbies:['洗澡','吃饭','睡觉']
              }
          });
          vm.hobbies[0] = '喝水';// 数据变化视图不刷新
          vm.hobbies.length--;// 数据变化视图不会刷新
      </script>
      vm.hobbies = ['喝水']; // 替换的方式
      vm.hobbies.push('吃饭'); // push slice pop ...变异方法
  • 不能给对象新增属性

      <div id="app">
      {{state.a}}
      </div>
      <script src="node_modules/vue/dist/vue.js"></script>
      <script>
          let vm = new Vue({
              el:'#app',
              data:{
                  state:{count:0}
              }
          });
          //vm.state.a = 100; // 新增熟悉不会响应到视图上
      </script>
  • 使用vm.$set方法强制添加响应式数据

      function $set(data,key,val){
      if(Array.isArray(data)){
          return data.splice(key,1,val);
      }
      defineReactive(data,key,val);
      }
      $set(data.arr,0,1);
    
      vm.$set(vm.state,'a','100');

vue实例上常见属性和方法 #

  • vm.$set();

      vm.$set(vm.state,'a','100');
  • vm.$watch();

      vm.$watch('state.count',function(newValue,oldValue){
          console.log(newValue,oldValue);
      });
  • vm.$mount();

      let vm = new Vue({
          data:{state:{count:0}}
      });
      vm.$mount('#app');
  • vm.$nextTick();

      vm.state.count = 100; // 更高数据后会将更改的内容缓存起来
      // 在下一个事件循环tick中 刷新队列
      vm.$nextTick(function(){
          console.log(vm.$el.innerHTML);
      });
  • vm.$data

  • vm.$el

vue中的指令 #

在vue中 指令 (Directives) 是带有 v- 前缀的特殊特性,主要的功能就是操作DOM

  • v-once

      <div v-once>{{state.count}} </div>
  • v-html (不要对用户输入使用v-html显示)

      <div v-html="text"></div>

    https://developer.mozilla.org/zh-CN/docs/Web/API/Element/innerHTML#%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98

  • v-text
  • v-if/v-else使用

v-for使用 #

  • v-for遍历数组

      fruits:['香蕉','苹果','桃子']
      <div v-for="(fruit,index) in fruits" :key="index">
          {{fruit}}
      </div>
  • v-for遍历对象

      info:{name:'jiang',location:'回龙观',phone:18310349227}
      <div v-for="(item,key) in info" :key="key">
          {{item}} {{key}}
      </div>
  • template的使用

      <template v-for="(item,key) in fruits">
          <p v-if="key%2">hello</p>
          <span v-else>world</span>
      </template>
  • key属性的应用

      <div v-if="flag">
          <span>前端</span>
          <input key="2"/>   
      </div>
      <div v-else>
          <span>架构</span>
          <input key="1"/>  
      </div>
  • key尽量不要使用索引

       <ul>
          <li key="0">🍌</li>
          <li key="1">🍎</li>
          <li key="2">🍊</l>
      </ul>
      <ul>
          <li key="0">🍊</li>
          <li key="1">🍎</li>
          <li key="2">🍌</li>
      </ul>

属性绑定 :(v-bind) #

Class 与 Style 绑定

  • 数组的绑定

          <div :class="['apple','banana']" ></div>
          <div :class="{banana:true}"></div>
  • 对象类型的绑定

          <div :class="['apple','banana']" ></div>
          <div :class="{banana:true}"></div>
          <div :style="[{background:'red'},{color:'red'}]"></div>
          <div :style="{color:'red'}"></div>

绑定事件 @ (v-on) #

  • 事件的绑定 v-on绑定事件
  • 事件修饰符 (.stop .prevent) .capture .self .once .passive

vue的双向绑定 (v-model) #

    <input type="text" :value="value" @input="input">
    <input type="text" v-model="value">
  • input,textarea
  • select

      <select v-model="select">
          <option 
              v-for="fruit in fruits"
              :value="fruit">
                  {{fruit}}
          </option>
      </select>
  • radio

      <input type="radio" v-model="value"  value="男">
      <input type="radio" v-model="value"  value="女">
  • checkbox

      <input type="checkbox" v-model="checks" value="游泳" >
      <input type="checkbox" v-model="checks" value="健身">
  • 修饰符应用 .number .lazy .trim

      <input type="text" v-model.number="value">
      <input type="text" v-model.trim="value">

鼠标 键盘事件 #

  • 按键、鼠标修饰符 Vue.config.keyCodes
    Vue.config.keyCodes = {
      'f1':112
    }

watch & computed #

  • 计算属性和watch的区别 (异步)

      let vm = new Vue({
          el:'#app',
          data:{
              firstName:'姜',
              lastName:'文',
              fullName:''
          },
          mounted(){
              this.getFullName();
          },
          methods:{
              getFullName(){
                  this.fullName = this.firstName + this.lastName
              }
          },
          watch:{
              firstName(){
                  setTimeout(()=>{
                      this.getFullName();
                  },1000)
              },
              lastName(){
                      this.getFullName();
              }
          }
          // 计算属性不支持异步
          // computed:{
          //    fullName(){
          //        return this.firstName + this.lastName;
          //    }
          // }
      });
  • 计算属性和 method的区别 (缓存)

条件渲染 #

  • v-if和v-show区别
  • v-if/v-else-if/v-else
  • v-show

过滤器的应用 (过滤器中的this都是window) #

  • 全局过滤器 和 局部过滤器
  • 编写一个过滤器
    <div>{{'hello' | capitalize(3)}}</div>
    Vue.filter('capitalize',(value,count=1)=>{
      return value.slice(0,count).toUpperCase() + value.slice(count);
    });

指令的编写 #

  • 全局指令和 局部指令
  • 编写一个自定义指令

    • 钩子函数bind,inserted,update

            <input type="text" v-focus.color="'red'">
            Vue.directive('focus',{
                inserted:(el,bindings)=>{
                    let color = bindings.modifiers.color;
                    if(color){
                        console.log('color')
                        el.style.boxShadow = `1px 1px 2px ${bindings.value}`
                    }   
                    el.focus();
                }
            });
  • clickoutside指令

    <div v-click-outside="change">
      <input type="text"  @focus="flag=true" >
      <div v-show="flag">
          contenter
      </div>
    </div>
    let vm = new Vue({
      el:'#app',
      data:{
          flag:false
      },
      methods:{
          change(){
              this.flag = false
          }
      },
      directives:{
          'click-outside'(el,bindings,vnode){
              document.addEventListener('click',(e)=>{
                  if(!el.contains(e.target,vnode)){
                      let eventName = bindings.expression;
                      vnode.context[eventName]()
                  }
              })
          }
      }
    })

    vue中的生命周期 #

  • beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。
  • created 实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。这里没有$el
  • beforeMount 在挂载开始之前被调用:相关的 render 函数首次被调用。
  • mounted el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
  • beforeUpdate 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
  • updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
  • beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

钩子函数中该做的事情 #

  • created 实例已经创建完成,因为它是最早触发的原因可以进行一些数据,资源的请求。
  • mounted 实例已经挂载完成,可以进行一些DOM操作
  • beforeUpdate 可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
  • updated 可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。 该钩子在服务器端渲染期间不被调用。
  • destroyed 可以执行一些优化操作,清空定时器,解除绑定事件

vue中的动画 #

vue中的动画就是从无到有或者从有到无产生的。有以下几个状态 transition组件的应用

.v-enter-active,.v-leave-active {
    transition: opacity 0.25s ease-out;
}
.v-enter, .v-leave-to {
    opacity: 0;
}

切换isShow的显示或者隐藏就显示出效果啦~

<button @click="toggle">toggle</button>
<transition>
    <span v-show="isShow">前端架构</span>
</transition>

默认的name是以v-开头,当然你可以自己指定name属性来修改前缀

使用animate.css设置动画 #

.v-enter-active {
    animation:zoomIn  2s linear
}
.v-leave-avitve{
    animation:zoomOut 2s linear
}

直接修改激活时的样式

<transition 
    enter-active-class="zoomIn"
    leave-active-class="zoomOut"
>
    <span class="animated" v-show="isShow">前端架构</span>
</transition>

vue中js动画 #

<transition 
    @before-enter="beforeEnter"
    @enter="enter"
    @after-enter="afterEnter"
>   
    <span class="animated" v-show="isShow">前端架构</span>
</transition>

对应的钩子有before-leave,leave,after-leave钩子函数,函数的参数为当前元素

beforeEnter(el){
    el.style.color="red"
},
enter(el,done){
    setTimeout(()=>{
        el.style.color = 'green'
    },1000);
    setTimeout(() => {
        done();
    }, 2000);
},
afterEnter(el){
    el.style.color = 'blue';
}

使用js动画库 #

https://github.com/julianshapiro/velocity

<script src="node_modules/velocity-animate/velocity.js"></script>
beforeEnter(el){
    el.style.opacity = 0;
},
enter(el,done){
    Velocity(el, {opacity: 1}, {duration: 2000, complete: done})
},
afterEnter(el){
    el.style.color = 'blue';
},
leave(el,done){
    Velocity(el, {opacity: 0}, {duration: 2000, complete: done})
}

筛选动画 #

<div id="app">
    <input type="text" v-model="filterData">
    <transition-group  
        enter-active-class="zoomInLeft" 
        leave-active-class="zoomOutRight"
    >
        <div v-for="(l,index) in computedData" :key="l.title" class="animated">
            {{l.title}}
        </div>
    </transition-group>  
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
    let vm = new Vue({
        el:'#app',
        data:{
            filterData:'',
            dataList:[
                {title:'标题1'},
                {title:'标题2'},
                {title:'标题4'},
                {title:'标题3'}
            ]
        },
        computed:{
            computedData(){
                return this.dataList.filter((item)=>{
                    return item.title.includes(this.filterData);
                })
            }
        },
    })
</script>
  • {{
  • slot v-for i in 5

    访问验证

    请输入访问令牌

    Token不正确,请重新输入