时间:2021-09-07 09:10:40 | 栏目:vue | 点击:次
此更改不会影响到<template>用户
// 2.0 渲染函数 export default { render(h) { return h('div') } } // 3.x语法 export default { render() { return h('div') } }
// 2.x export default { render(h) { return h('div') } } // 3.x import { h, reactive } from 'vue' export default { setup(prop, {slots, attrs, emit}) { const state = reactive({ count: 0 }) function increment() { state.count++ } // 返回render函数 return () => h( 'div', { onClick: increment }, state.count ) } }
// 2.x { class: ['button', 'is-outlined'], style: {color: '#fffff'}, attr: {id: 'submit'}, domProps: {innerHTML: ''}, on: {click: submitForm}, key: 'submit-button' } // 3.x VNode的结构是扁平的 { class: ['button', 'is-outlined'], style: { color: '#34495E' }, id: 'submit', innerHTML: '', onClick: submitForm, key: 'submit-button' }
更改了普通slot和作用域slot
// 2.x h(LayoutComponent, [ h('div', {slot: 'header'}, this.header), h('div', {slot: 'header'}, this.header) ]) // 作用域slot: // 3.x h(LayoutComponent, {}, { header: () => h('div', this.header), content: () => h('div', this.content) }) // 需要以编程方式引入作用域slot时,他们现在被统一在了$slots选项中 // 2.x的作用域slot this.$scopedSlots.header // 3.x的写法 this.$slots.header
$listeners
对象在vue3中已经移除,现在事件监听器是$attrs
的一部分
在vue2中,可以使用this.attrs和this.attrs和this.listeners分别访问传递给组件的attribute和时间监听器,结合inheritAttrs: false,开发者可以将这些attribute和监听器应用到其他元素,而不是根元素
<template> <label> <input type="text" v-bind="$attrs" v-on="$listeners"> </label> </template> <script> export default { inheritAttrs: false } </script>
在vue的虚拟DOM中,事件监听器现在只是以on为前缀的attribute,这样就成了attrs对象的一部分,这样attrs对象的一部分,这样listeners就被移除了
<template> <label> <input type="text" v-bind="$attrs" /> </label> </template> <script> export default { inheritAttrs: false } // 如果这个组件接收一个 id attribute 和一个 v-on:close 监听器,那么 $attrs 对象现在将如下所示 { id: 'my-input', onClose: () => console.log('close Event Triggered') } </script>
现在的$attr包含所有的attribute,包括class和style
在2.x中,虚拟dom会对class和style进行特殊处理,所以他们不包括在$attr中
在使用inheritAttr: false的时候会产生副作用
<template> <label> <input type="text" v-bind="$attrs" /> </label> </template> <script> export default { inheritAttrs: false } </script> <!-- 写入 --> <my-component id="my-id" class="my-class"></my-component> <!-- vue2 将生成 --> <label class="my-class"> <input type="text" id="my-id" /> </label> <!-- vue3 将生成 --> <label> <input type="text" id="my-id" class="my-class" /> </label>