Предложение по настройке сценария vue3 находится на экспериментальной стадии в течение нескольких месяцев.Когда мы используем vue-шаблон vite, терминал сообщит нам, что это все еще экспериментальное предложение, и рекомендуется заблокировать версию vue, чтобы избежать поломка, если мы используем этот метод письма. Так что у меня просто было понимание этого предложения раньше, и я не использовал это обозначение в своей работе. Наконец мы приветствовали его утром 29 июня 2021 года.Finalization, ниже кратко изложено содержание этого окончательного проекта.
Следующий контент будет реализован в версии 3.1.3, но «экспериментальный» статус этого предложения не будет официально удален до версии 3.2, а устаревшие API, упомянутые ниже, не будут перемещены до версии 3.2. За исключением старого и нового API будут сосуществовать некоторое время до этого.
заброшенныйuseContext
API
Предыдущее использование было таким:
import { useContext} from 'vue'
const { attrs, emit, expose, slots } = useContext()
Этот API будет удален после версии 3.2 и будет разделен на несколько новых API для замены
новыйuseAttrs
API
attrs
это свойство, передаваемое от родительского компонента к дочернему компоненту, за исключениемprops
,class
так же какstyle
Внешние свойства:
// 父组件
<child a="1" b="2" msg="hello" class="child" style="color:red" />
Например, в приведенном выше коде родительский компонент передает несколько свойств дочернему компоненту, мы предполагаемchild
компонент определяетmsg
prop, то дочерний компонент получаетattrs
то есть{a: "1", b: "2"}
.
Старое использование:
import { useContext} from 'vue'
const { attrs } = useContext()
console.log(attrs)
Новое использование:
import { useAttrs } from 'vue'
const attrs = useAttrs()
console.log(attrs)
новыйuseSlots
API
useSlots
Как правило, он используется только с JSX. Чтобы понять, новый метод написания представлен ниже. Старый метод написания заключается в том, чтобы поставитьuseSlots
заменитьconst slots = useContext()
Просто делать:
// 父组件
<child>
<div>默认插槽</div>
<template #left>
<div>具名插槽</div>
</template>
</child>
// 子组件
import { defineComponent, useSlots } from 'vue'
const Child = defineComponent({
setup() {
const slots = useSlots()
// 渲染组件
return () => (
<div>
// 默认插槽
<div>{ slots.default ? slots.default() : '' }</div>
// 具名插槽
<div>{ slots.left ? slots.left() : '' }</div>
</div>
)
},
})
export default Child
новыйdefineExpose
API
когда используешь<script setup>
, вы можете поставить<template>
рассматривается какsetup
Функция в такой области видимости, чтоsetup
эквивалентно замыканию, за исключением того, что внутренний<template>
Никто не может получить доступ к данным в пределах его области действия. Как код ниже:
function setup() {
const a = 1
const b = 2
return function template() {
// has access to `b` but doesn't necessarily uses it
return `<div>${a}</div>`
}
}
Поэтому в традиционном методе написания настройки мы можем получить доступ к данным и методам дочернего компонента через экземпляр ref дочернего компонента в родительском компоненте (childRef.value.someFn()
),прибыть<script setup>
Этот набор здесь не подойдет, вам нужно выставить контент, который вы хотите выставить наружу.
СтарыйuseContext
API работает так:
// 子组件
<script setup>
import { useContext } from 'vue'
const { expose } = useContext()
const a = 1
const b = 2
expose({
a
})
</script>
// 父组件
<template>
<child ref="childRef" />
</template>
<script setup>
import { ref } from 'vue'
const childRef = ref()
console.log(childRef.value.a) // 1
console.log(childRef.value.b) // undefined
</script>
с новымdefineExpose
API:
import { defineExpose } from 'vue'
const a = 1
const b = 2
defineExpose({
a
})
defineEmit
-> defineEmits
defineEmit
defineEmit
API был переименованdefineEmits
, потому что любой вариантemits,props
или APIdefineProps
оба во множественном числе, передdefineEmit
Это кажется немного ослепительным, и унифицированное число меняется на множественное, а использование остается прежним.
import { defineEmits } from 'vue'
const emit = defineEmits(['change', 'close'])
emit('change', 'change事件的payload')
emit('close', 'close事件的payload')
новыйwithDefaults
API
Когда мы используем TS в vue, есть два способа определить тип реквизита:
- Это конструктор нативного js
String, Boolean, Number, Array
Ждать:
import { defineProps } from 'vue'
defineProps({
name: {
type: String,
default: 'Niko',
},
age: Number
})
- Определяется типами ТС:
import { defineProps } from 'vue'
defineProps<{
name: string
age: number
}>()
Однако при использовании второго метода невозможно определить значение реквизита по умолчанию. Используйте новыйwithDefaults
API может реализовать определение реквизита по умолчанию, он получает два параметра, первый из нихdefineProps()
, второй по умолчанию:
import { defineProps, withDefaults } from 'vue'
withDefaults(defineProps<{
name: string
age: number
}>(), {
name: 'Niko',
age: 18
})
инструкция по восстановлениюv
приставка
использовать сейчасv-my-dir
Такая инструкция должна использоваться при определении переменной инструкции.vMyDir
, то есть добавлениеv
приставка.
<script setup>
import { directive as vClickOutside } from 'v-click-outside'
</script>
<template>
<div v-click-outside />
</template>
верхawait
служба поддержки
теперь можно напрямую<script setup>
запись блока на верхнем уровнеawait
вместо того, чтобы положитьasync
функция, она будет автоматически скомпилирована вasync setup()
.
Удалить<template>
Вверхinherit-attrs
Атрибуты
Как определить что-то вродеname
Такой вариант?
На этот ответ отвечают вместе с предыдущим, равным<script setup>
независимый<script>
блок для определения:
<script>
export default {
name: 'CustomName',
inheritAttrs: false,
customOptions: {},
}
</script>
<script setup>
// script setup logic
</script>
See Declaring Additional Options and Automatic Name Inference.