Введение
что ты сказал вчера
组合式API
,# Уже почти 2202 год, а вы до сих пор не знаете, что такое API композиции Vue3?Приходи и послушай, как я выдуваю vue3 сегодняsetup
как пользоваться
Заимствование предложения с официального сайта
setup
вариант полученияprops
иcontext
Функция
То есть его основное написание должно быть таким
export default{
name: 'test',
setup(props,context){
return {} // 这里返回的任何内容都可以用于组件的其余部分
}
// 组件的“其余部分”
}
получитьprops
иcontext
функционировать и будетsetup
содержание черезreturn
подвергается воздействию остальной части компонента.
два,setup
будь осторожен
-
Поскольку метод жизненного цикла Created не был выполнен при выполнении функции настройки, переменные и методы данных и методы не могут использоваться в функции настройки.
-
Поскольку мы не можем использовать данные и методы в функции настройки, Vue напрямую изменяет это значение в функции настройки на undefined, чтобы избежать неправильного использования.
3. Определите адаптивные данные
ref
reactive
пропуск vue3ref
reactive
определить адаптивные данные
Как и реактивный, ref также является методом реализации адаптивных данных.
- Поскольку reactive должен передавать объект, будет очень проблематично, если мы хотим сделать переменную реактивной только в корпоративной разработке, поэтому Vue3 предоставляет нам метод ref для мониторинга простых значений.
ref
мы привыкли基本数据类型
Определяемый как реагирующие данные (ref больше подходит для определения базовых типов данных), основная природа ref фактически является реактивной, и система автоматически преобразует его в ref в соответствии с переданным значением.ref(xx) -> reactive({value:xx})
reactive
использовал к引用类型
Определяемый как отзывчивые данные, его сущность основана наProxy
Реализовать объектный прокси
- Базовый тип данных (один тип): кроме Объекта. String, Number, boolean, null, undefined.
- тип ссылки: объект. Он содержит функцию, массив, дату.
определение
<script>
import {ref, reactive} from "vue";
export default {
name: "test",
setup(){
// 基本类型
const nub = ref(0)
const str = ref('inline')
const boo = ref(false)
// 引用类型
const obj = reactive({
name:'inline',
age:'18'
})
const arr = reactive(['0','1','2'])
return{
nub,
str,
boo,
obj,
arr,
}
}
}
</script>
использовать
<template>
<div>
<h1>基本类型</h1>
<p>nub:{{ nub }}</p>
<p>str:{{ str }}</p>
<p>boo:{{ boo }}</p>
</div>
<div>
<h1>引用类型</h1>
<p>obj:{{ obj.name }}</p>
<p>arr:{{ arr[1] }}</p>
</div>
</template>
результат
Четыре,toRefs
если мы используемreactive
определяется в виде响应式
Переменная
setup(){
const obj = reactive({
name:'inline',
gender:'男',
age:'18'
})
return{
obj
}
}
использовать
<div>
<p>姓名:{{ obj.name }}</p>
<p>性别:{{ obj.gender }}</p>
<p>年龄:{{ obj.age }}</p>
</div>
Таким образом, нам трудно использовать параметры в шаблоне, тогда мы хотим использовать его напрямую{{ name }}
Способ доступа не подойдет, ответ выполним
Здесь мы используемes6
спред оператор
setup(){
const obj = reactive({
name:'inline',
gender:'男',
age:'18',
})
return{
...obj,
}
}
использовать
<div>
<p>姓名:{{ name }}</p>
<p>性别:{{ gender }}</p>
<p>年龄:{{ age }}</p>
</div>
<div>
<button @click="name = 'juejin'">改变姓名</button>
<button @click="gender = '女'">改变性别</button>
<button @click="age = '20'">改变年龄</button>
</div>
результат
Здесь мы видим, что наши параметры отображаются на странице нормально, но когда мы заходим изменить параметры, мы обнаруживаем, что представление не обновляется.Почему? ? ?
Мы запишем оператор распространения как его эквивалентную форму
const obj = reactive({
name:'inline',
gender:'男',A
age:'18',
})
// ...obj ==> name:obj.name
Эй, подождите минутку, как я могу подсказать, когда моя мышь всплывает?name
просто строка?
Затем мы смотрим, что мы используемref
Что подсказывать при определении значения
Ооо, на этот раз мы видимname
ЯвляетсяRef<string>
,Является响应式
нить.
Таким образом, мы находим причину, по которой представление не обновляется, когда мы используем...扩展运算符
То, что мы получаем, — это обычный тип значения, а не адаптивные данные.
Чтобы решить эту проблему, vue3 предоставляет намtoRefs
функция, давайте посмотрим, как это работает
setup(){
const obj = reactive({
name:'inline',
gender:'男',
age:'18',
})
return{
...toRefs(obj),
}
}
<div>
<p>姓名:{{ name }}</p>
<p>性别:{{ gender }}</p>
<p>年龄:{{ age }}</p>
</div>
<div>
<button @click="name = 'juejin'">改变姓名</button>
<button @click="gender = '女'">改变性别</button>
<button @click="age = '20'">改变年龄</button>
</div>
Параметры могут быть изменены в обычном режиме, и преобразование прошло успешно.
toRefsСводка
toRefs
возьмет нас один响应式
объект превращается в普通
объект, а затем преобразовать это普通对象
Каждое свойство становится реактивными данными
пять,setup
выполнить метод
метод первый
отreactive
Способ определения реактивных данных для определения методов
<script>
import {ref, reactive,toRefs} from "vue";
export default {
name: "test",
setup(){
const str = ref('inline')
const fun = reactive({
fun1(data){
console.log(str.value)
this.fun2(data)
},
fun2(data){
console.log(data)
console.log('我是fun2')
}
})
return{
...toRefs(fun),
}
}
}
</script>
Передать значение событию кликаfun1
,fun1
После получения отправьте его наfun2
Здесь мы используемthis.fun2()
способ позвонитьfun2
, зачем использовать здесьthis
Может выполняться в обычном режиме без сообщенияundefind
, потому что здесьthis
нетthis
, в Vue2this
это пример здесьthis
является объектом
<button @click="fun1('你好')">点我1</button>
В результате он успешно вызывается и выводится
Способ 2
Обратите внимание на вызов здесьfun2
Способ отличается от способа один, его можно вызвать напрямую, не нужноthis
перечислить
export default {
name: "test",
setup(){
const fun1 = (data) => {
fun2(data)
}
const fun2 = (data) => {
console.log(data)
}
return{
fun1,
}
}
}
перечислить
<button @click="fun1('你好 inline')">点我1</button>
результат
способ третий
Таким образом, вся функциональная логика не помещается в кучу.setup
проблема, мы можем написать отдельные функции как отдельные функции
а вот и яsetup
написано снаружиfun()
login()
Две функциональные функции, и вызывать их отдельно в настройках
import {ref, reactive,toRefs} from "vue";
export default {
name: "test",
setup(){
const test1 = fun() // 如果函数返回参数过多,可以赋值给变量并用扩展运算符暴露给组件的其余部分
const { test } = login() // 也可单个接收
return{
...toRefs(test1),
test,
}
}
}
// 功能1
function fun(){
let str = ref('我是功能1')
function fun1(data){
console.log(str.value)
fun2(data)
}
function fun2(data){
console.log(data)
}
return{
fun1,
fun2,
}
}
// 功能2
function login() {
const obj = reactive({
msg:'我是功能2,我爱掘金'
})
function test() {
console.log(obj.msg)
}
return{
test
}
}
</script>
перечислить
<button @click="fun1('你好 inline')">点我1</button>
<button @click="test">点我2</button>
результат
способ четвертый
То же, что и в режиме 3, за исключением того, что мы извлекаем две функции и помещаем их в отдельные.js
в файле
Затем импортируйте компонент и вsetup
внутренний звонок
<template>
<div style="text-align: center;margin-top: 50px">
<button @click="fun1('你好 inline')">点我1</button>
<button @click="test">点我2</button>
</div>
</template>
<script>
import {ref, reactive,toRefs} from "vue";
import { fun,login } from './test.js'
export default {
name: "test",
setup(){
const test1 = fun()
const { test } = login()
return{
...toRefs(test1),
test,
}
}
}
</script>
выполнить нормально и ввести
способ пятый
Мы также можем написать так, здесь я определяюreactive
Реактивный объект, назначенныйlogin
Переменная, этот отзывчивый объект содержит то, что нам нужно для входа в систему.参数
,验证
и方法
, здесь мы все положилиlogin
внутри этого реактивного объекта, а затем используйтеtoRefs
и扩展运算符
незащищенный
<script>
import {ref, reactive,toRefs} from "vue";
export default {
name: "test",
setup(){
const login = reactive({
param: {
username: '123',
password: '123456',
},
rules: {
username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
},
login(){
this.param.username = 'inline'
this.param.password = '123456'
console.log('成功登录!')
}
})
return{
...toRefs(login),
}
}
}
</script>
давайте использовать
<input type="text" v-model="param.username">
<input type="password" v-model="param.password">
<button @click="login">登录</button>
Нормальное выполнение, поэтому мы также можем записать все методы и связанные с ними параметры функции вreactive
внутри объекта
Если есть какой-либо отсутствующий метод реализации, укажите его в области комментариев~~~
Шесть, настройка скрипта
script setup
Он был официально выпущен в версии vue3.2.
использование
<script setup>
</script>
Разве это не супер просто
Переменные методы не должныreturn
использовать
<script setup>
, шаблон компилируется в функцию рендеринга, встроенную в область действия функции установки. Это означает, что любые привязки верхнего уровня, объявленные внутри<script setup>
можно использовать прямо в шаблоне
<script setup>
const msg = 'Hello!'
</script>
<template>
<div>{{ msg }}</div>
</template>
script setup
Переменные и методы, определенные внутри, не нужно возвращать, и их можно использовать напрямую.
импорт компонента
Импортированные компоненты не требуют регистрации и могут использоваться напрямую
<script setup>
// 导入的组件也可以直接在模板中使用
import Foo from './Foo.vue'
import { ref } from 'vue'
// 编写合成API代码,就像在正常设置中一样
// 不需要手动返回所有内容
const count = ref(0)
const inc = () => {
count.value++
}
</script>
<template>
<Foo :count="count" @click="inc" />
</template>
выпускProps
иEmits
<script setup>
const props = defineProps({
foo: String
})
const emit = defineEmits(['update', 'delete'])
</script>
обычныйscript
иscript setup
script setup
может иscript
одновременно существуют
<script>
export const name = 1
</script>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
script setup
Дополнительные опции
script setup
дает нам большую частьoptions api
Эквивалентная способностьэто
options api
что можно сделатьscript setup
Большинство может сделать
Что ещеscript setup
Не можете сделать это? следующее:
name
inheritAttrs
- Параметры настройки, требуемые плагином или библиотекой
Так что, если я хочу использовать их? ответнаписать отдельно
<script>
export default {
name: 'CustomName',
inheritAttrs: false,
customOptions: {}
}
</script>
<script setup>
// script setup logic
</script>
defineExpose
script setup
Определенная переменная не будет отображаться по умолчанию, потому что переменная включена вsetup
в закрытии. В этот момент мы можем использоватьdefinExpose({ })
выставить внутренние свойства компонента для использования родительским компонентом
<script setup>
const a = 1
const b = ref(2)
defineExpose({
a,
b
})
</script>
Когда родительский компонент получает экземпляр этого компонента через ссылку на шаблон, полученный экземпляр будет таким:{ a: number, b: number }
(ссылки автоматически расширяются, как в обычных экземплярах)
7. Пишите в конце
script setup
Есть еще много вещей, которые можно сказать, и когда я пойму это в последние несколько дней, я смогу опубликовать отдельный вопрос о его использовании.
Наконец, спасибо, что читаете~~~ Ваши лайки и чтение - самая большая поддержка для меня~~~
Прошлые статьи vue3:
# Экспериментируя с настройкой скрипта в vue3.2, попробуйте применить ...toRefs