移除的API

keyCode作为v-on修饰符被移除

  • 非兼容:不再支持使用数字 (即键码) 作为 v-on 修饰符
  • 非兼容:不再支持 config.keyCodes

在 Vue 2 中,keyCodes 可以作为修改 v-on 方法的一种方式。

<!-- 键码版本 -->
<input v-on:keyup.13="submit" />

<!-- 别名版本 -->
<input v-on:keyup.enter="submit" />

此外,也可以通过全局的 config.keyCodes 选项定义自己的别名。

Vue.config.keyCodes = {
  f1: 112
}

  

<!-- 键码版本 -->
<input v-on:keyup.112="showHelpText" />

<!-- 自定义别名版本 -->
<input v-on:keyup.f1="showHelpText" />

 在vue3中建议对任何要用作修饰符的键使用 kebab-cased (短横线) 名称。

<!-- Vue 3 在 v-on 上使用按键修饰符 -->
<input v-on:keyup.page-down="nextPage">

<!-- 同时匹配 q 和 Q -->
<input v-on:keypress.q="quit">

config.keyCodes 现在也已弃用,不再受支持。

事件 API的变化

 $on$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口。

上述3个方法被认为不应该由vue提供,因此被移除了。

$emit仍然包含于现有的API中,因为它用于触发由父组件声明式添加的事件处理函数

app.vue

<template>
   <div>
      <com @cut="fun"></com>
   </div>
</template>

<script>
import com from "./components/com.vue"
   export default {
      components:{
         com
      },
      methods:{
         fun(){
            console.log("父组件声明的添加的事件处理函数")
         }
      }
   }
</script>

 com.vue

<template>
    <div>
        <button @click="$emit('cut')">click</button>
    </div>
</template>

 

 

 如果我们要用编程式的方式派发事件,需要借助于第三方库来实现  mitt

npm install mitt

com.vue

<template>
    <div>
        mycom
        <button @click="$emit('cut')">触发事件</button>
        <button @click="fn">派发事件 someEvent</button>
    </div>
</template>
<script>
import mitt from 'mitt'
export const mitter=mitt()
export default {
     methods:{
         fn(){
             mitter.emit('someEvent',"编程式方式派发事件")
         }
     }
}
</script>

 创建mitter事件派发器

comtwo.vue

<template>
    <div>
        comtwo
    </div>
</template>
<script>
import {mitter} from './com'
export default {
    mounted(){
        // 监听事件
        mitter.on('someEvent',(e)=>{
            console.log(e)
        })
    }
}
</script>

 

Filters过滤器移除

在vue3中,过滤器已删除,不再支持,我们建议用方法调用或计算属性来替换它们

app.vue

<template>
   <div>
      <filtertest :countPrice="price"></filtertest>
   </div>
</template>

<script>
import filtertest from "./components/filtertest.vue"
   export default {
      components:{
         filtertest
      },
      data(){
         return {
            price:10000
         }
      }
   }
</script>

 filtertest.vue

<template>
    <div>
        {{countPrice}}
        <br/>
        {{changePrice}}
    </div>
</template>
<script>
export default {
    props:{
        countPrice:{
            type:Number,
            required:true
        }
    },
    computed:{  //计算属性代替过滤器
       changePrice(){
           return '$'+this.countPrice
       }
    }
}
</script>

 

 

 如果在应用中全局注册了过滤器,那么在每个组件中用计算属性或方法调用来替换就没那么方便了,可以通过定义全局属性在所有组件中使用

main.js

import { createApp,createRenderer} from "vue";
import App from "./App.vue";
const app=createApp(App);
//定义全局属性
app.config.globalProperties.$filters={
    currentUSD(e){
        return '$'+e
    }
}
app.mount("#app")

 filtertest.vue

<template>
    <div>
        {{countPrice}}
        <br/>
        {{$filters.currentUSD(countPrice)}}
    </div>
</template>
<script>
export default {
    props:{
        countPrice:{
            type:Number,
            required:true
        }
    },
}
</script>

 

 注意:这种方法只能用于方法中,不可以在计算属性中使用

移除内联模板 Attribute

在 2.x 中,Vue 为子组件提供了 inline-template attribute,以便将其内部内容作为模板使用,而不是作为分发内容。

<my-component inline-template>
  <div>
    <p>它们将被编译为组件自己的模板,</p>
    <p>而不是父级所包含的内容。</p>
  </div>
</my-component>

 inline-template的大多数用例都假设没有构建工具设置,所有模板都直接写在HTML页面中,vue3不再支持

使用script替代

使用script定义模板

<body>
    <div id="app">
        <my></my>
    </div>
    <script type="text/html" id="my-template">
        <div>
            hello 
        </div>
    </script>
    <script>
        const {createApp}=Vue
        const app=createApp({})
        app.component('my',{
            // 使用选择器将模板作为目标
            template:"#my-template"
        })
        app.mount('#app')
    </script>
</body>

默认slot

使用 inline-template的组件也可以使用默认slot--进行重构,这使得数据范围更加明确,同时保留了内联编写子内容的便利性

<body>
    <div id="app">
        <child-component v-slot="{childState}">   
          <div>         
                <h2>在父组件中定义子组件模板</h2>
                <p>{{childState}}</p>
                <p>{{parentData}}</p>       
          <div>    
        </child-component>
    </div> 
    <script>
        const {createApp}=Vue
        const app=createApp({
            data(){
                return {
                    parentData:"父组件定义的数据"
                }
            }
        })
        app.component('child-component',{
            template:`<slot :childState="childState"></slot>`,
            data(){
                return {
                    childState:"子组件定义的数据"
                }
            }
        })
        app.mount('#app')
    </script>
</body>

 

 在vue3中,slot可以渲染为具有原生fragments支持的根目录

  <div id="app">
        <child-component v-slot="{childState}">       
                <h2>在父组件中定义子组件模板</h2>
                <p>{{childState}}</p>
                <p>{{parentData}}</p>       
        </child-component>
    </div> 

$children实例已移除

$destroy实例已移除

propsData也被vue3移除

 

posted @ 2021-11-12 16:29  keyeking  阅读(91)  评论(0编辑  收藏  举报