предисловие
Каждый должен знать, что если вы используетеVue3
изComposition API
Определение адаптивной переменной обычно имеет две формы, одна из которых заключается в использованииref
, другойreactive
:
<script setup>
import { ref, reactive } from 'vue'
const isLoading = ref(true)
const user = reactive({
name: '令狐冲',
age: 22,
gender: '男'
})
</script>
В общем, определение базового типа данных будет использоватьref
, в то время как ссылочные типы используютreactive
, тогда возникает вопрос,ref
Хотя базовый тип данных определен, на самом деле это ссылочный тип, который необходимо брать с собой при взятии значений и присваиваний..value
Атрибуты:
<script setup>
import { ref } from 'vue'
const isLoading = ref(true)
if (isLoading.value) {
isLoading.value = false
}
</script>
Это немного нелогично, и можно случайно написать так:
<script setup>
import { ref } from 'vue'
let isLoading = ref(true)
if (isLoading) {
isLoading = false
}
</script>
если этоTS
а такжеESLint
Благо хорошо, если нет, то будет сложно найти ошибки, и никакого полезного сообщения об ошибке выдаваться не будет, а это приходится каждый раз приводить.value
Это действительно некрасиво, и хлопотно писать!
reactive
Недостаток в том, что его нельзя деконструировать, а деконструкция потеряет свою отзывчивость:
<script setup>
import { reactive } from 'vue'
const user = reactive({
name: '令狐冲',
age: 22,
gender: '男'
})
// 这种写法通常达不到预期的效果
let { age } = user
age = 18
</script>
Некоторые люди могут сказать, нетtoRefs
? использовалtoRefs
, вернемся к этому.value
Проблема в:
<script setup>
import { reactive, toRefs } from 'vue'
const user = reactive({
name: '令狐冲',
age: 22,
gender: '男'
})
let { age } = toRefs(user)
age.value = 18
</script>
На самом деле, я лично думаю, что это нормально, потому что я привык писать, и я всегда использую TS, чтобы иметь подсказки и автодополнение, поэтому я не думаю, что есть какие-то проблемы.
Но это похоже на«Почему vue3 не может удалить лишние функции, такие как ref(), а svelte может? 》Такого рода проблемы глубоко ранят сердце босса, да и собственное обсессивно-компульсивное расстройство босса тоже совершено.В конце концов, он создалVue
Один из самых удачных элементов方便
. И теперь этот избыточный способ написания связан с方便
Это не имеет к этому никакого отношения, поэтому Ю Да должен решить эту проблему во что бы то ни стало, и не позволять людям говорить за их спинами.Vue
еще не написаноSvelte
Это удобно? Итак, большой парень создал три разных синтаксических сахара, а именно:
- «[Перевод] Юйси Ю: Предложение по синтаксическому сахару»
- «Vue Вторая волна Ref Syntax Proviption на этот раз будет на этот раз? 》
- Эта статья (модифицированная версия второй волны синтаксического сахара)
Давайте кратко рассмотрим, как записываются эти три синтаксических сахара:
первая волна синтаксического сахара
Первая волна была в основном подражаниемSvelte
, давайте сначала посмотримSvelte
Пример, приведенный на китайском официальном сайте:
<script>
export let title;
// 这将在“title”的prop属性更改时更新“document.title”
$: document.title = title;
$: {
console.log(`multiple statements can be combined`);
console.log(`the current title is ${title}`);
}
</script>
это$:
является своего родаlabel
синтаксис, которого нетSvelte
Это самодельная грамматика, но юридическая грамматика, которая была лихорадочно протестирована на грани того, чтобы быть заброшенной в течение длительного времени, но эта грамматика изначально не использовалась таким образом, и люди использовали ее во вложенных циклах:
let num = 0
outermost:
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
if (i == 5 && j == 5) {
continue outermost
} else {
console.log(i, j, 88)
}
num++
}
}
console.log(num) //95
Не беда, если вы его не понимаете, да и не нужно разбираться в этом синтаксисе, потому что он не интуитивно понятен и не очень полезен, поэтому им почти никто не пользуется! Когда я пишу этот код в редактореESLint
Все они сообщают об ошибках:
переводить:
Label
Грамматика связана сGOTO
заявление, его использование сделает код трудным для понимания и обслуживания.—ESLint
Но так как им никто не пользуется, он по-прежнемуJS
юридический синтаксис, используйте его, чтобы сообщить компилятору, чтоref
Разве переменные не идеальны? Так что You Da также помирилсяSvelte
Аналогичный синтаксис:
<script setup>
ref: isLoading = true
if (isLoading) {
isLoading = false
}
</script>
Так почему же люди так противятся этому? это потому чтоlabel
Грамматика так не используется.break
,continue
Употребляется вместе, хотя это и не является грамматической ошибкой при использовании в других местах, но вы явно модифицировали его.JS
оригинальный смысл! Хотя Ю Да выразил недовольство: почему?Svelte
Вы ничего не сказали об использовании этой штуки, и вы начали распылять, когда я использовал эту штуку? !
личное чувство, потому что
Svelte
Говорит о себе как компилятор с самого начала, без тяжелого исторического багажа, в то время какVue
Наоборот. а такжеSvelte
Сам по себе это не мейнстримный фреймворк, он принадлежит тем, кто любит подбрасывать. ноVue
Не то же самое, сколько людей должны полагаться наVue
Когда дело доходит до еды, не всем нравится так много разбрасываться.
Так что в отчаянии Ю Да был вынужден отказаться от предложения, но этот вопрос все еще оставался в сердце Ю Да, как палка в его горле, поэтому он впитал первую волну обучения грамматике и начал сначала. составлено:
Вторая волна синтаксического сахара
<script setup>
let loading = $ref(true)
if (loading) {
loading = false
}
</script>
Видно, что мы не вводили$ref
Откуда взялась эта переменная? пока<script>
Лейбл написалsetup
Это свойство автоматически вставит глобальную переменную (Сначала необходимо включить переключатель экспериментального синтаксиса.)
You Da подумал про себя: тебе не кажется, что я раньше использовал неправильную грамматику? Тогда я должен быть в порядке с этим письмом на этот раз! Подумайте, прежде чем мы определимref
переменная, в первую очередьref
Импортируйте, а затем используйте:
import { ref } from 'vue'
const loading = ref(true)
Новый синтаксис можно использовать напрямую без кавычек, подобно глобальным переменным. Кроме$ref
Что касается этой специальной глобальной переменной, это предложение также включает:$computed
,$fromRefs
а также$raw
Эти вещи. Давайте посмотрим один за другим$computed
:
<!-- 以前 -->
<script setup>
import { ref, computed } from 'vue'
const num = ref(1)
const num_10 = computed(() => num.value * 10)
</script>
<!-- 现在 -->
<script setup>
let num = $ref(1)
const num_10 = $computed(() => num * 10)
</script>
$fromRefs
Что это такое? Этого раньше не было! только слышалtoRefs
:
<script setup>
import { fromRefs } from 'vue' // 这个API并不存在
import { toRefs } from 'vue' // 这个API倒是有 也就是只有 to 没有 from
</script>
На самом деле это$fromRefs
просто чтобы соответствоватьtoRefs
и сгенерировано, скажем, мы написалиuseXxx
:
import { reactive } from 'vue'
const state = reactive({
x: 0,
y: 0
})
export default = (x = 0, y = 0) => {
state.x = x
state.y = y
return toRefs(state)
}
Итак, когда мы его используем:
<script setup>
import { useXxx } form '../useXxx.js'
const { x, y } = useXxx(100, 200)
console.log(x.value, y.value)
</script>
Разве это не еще одна вещь, которую Ю Да не хотел видеть?.value
имущество? так$fromRefs
Он родился, чтобы решить эту проблему:
<script setup>
import { useXxx } form '../useXxx.js'
const { x, y } = $fromRefs(useXxx(100, 200))
console.log(x, y)
</script>
Последний API$raw
Ну, сырое не значит оригинальное! Дальше можно догадаться по названию, то есть используем$ref
То, что создано, на самом деле является отзывчивым对象
, не примитивный тип данных, а синтаксический сахар позволит нам измениться, как если бы мы использовали примитивные типы данных, но иногда мы хотим посмотреть на это对象
Как это выглядит, то нам нужно использовать$raw
сейчас:
<script setup>
const loading = $ref(true)
console.log(loading) // 其实打印的不是 loading 这个对象 而是它里面的值 相当于 loading.value
console.log($raw(loading)) // 这回打印的就是 loading 这个对象了
</script>
Улучшенная версия
Вскоре эта версия синтаксического сахара снова была улучшена.$
а также$$
Эти две переменные, если мы напишем это без синтаксического сахара:
<script setup>
import { ref } from 'vue'
const loading = ref(true)
console.log(loading.value)
</script>
После использования синтаксического сахара он становится таким:
<script setup>
import { ref } from 'vue'
const loading = $(ref(true))
console.log(loading)
</script>
Если мы хотим восстановитьloading
Эту переменную нам нужно использовать$$
сейчас:
<script setup>
import { ref } from 'vue'
let loading = $(ref(true))
console.log($$(loading))
</script>
Или можно написать так:
<script setup>
import { ref } from 'vue'
const loadingRef = ref(true)
let loading = $(loadingRef)
console.log(loadingRef === $$(loading))
</script>
синтаксический сахар третьей волны
Третья волна синтаксического сахара в основном улучшена на основе второй волны грамматики, за исключением того, что многие люди считают, что ее следует писать как$(ref())
Это действительно такая вещь...
С другой стороны, реализуетсяprops
синтаксический сахар, новый синтаксис в основном для каждого.value
переменные методы имеют$
Эквивалент префикса, например:
ref
computed
shallowRef
customRef
toRef
В то же время улучшенная версия$
переменная с$$
переменная дляprops
Деконструкция:
<script setup>
const { isLoading } = $(defineProps({ isLoading: Boolean }))
</script>
Чтобы знать, что мы не могли быть правы раньшеprops
деконструирован, и теперь также можно использоватьES6
Значение деструктуризации по умолчанию записывается какprops
Установить значение по умолчанию:
<!-- 以前 -->
<script setup>
const props = defineProps({
isLoading: {
type: Boolean,
default: true
}
}))
console.log(props.isLoading)
</script>
<!-- 现在 -->
<script setup>
const { isLoading = true } = $(defineProps({ isLoading: Boolean }))
console.log(isLoading)
</script>
Три волны обращения с предложением синтаксического сахара
- Первая волна:GitHub.com/vUEJS/RFCs/…
- Вторая волна:GitHub.com/vUEJS/RFCs/…
- Третья волна:GitHub.com/vUEJS/RFCs/…
Этот фреймворк, очевидно, чаще всего используется китайцами, но самое смешное, что на самом деле это группа иностранцев, которые ведут переговорыVue
Следующий шаг плана, когда вы увидите это, некоторые люди скажут: китайцы заняты.996
Ну, как я могу найти время для обсуждения таких вещей...
Тогда это зависит от того, что вы думаете: эти беспорядочные синтаксические сахара не имеют для вас значения, я просто учу любую грамматику, я просто один沉默的羔羊
.
Или: вы просто оставляете комментарий внизу этой статьи, говоря, что вам нравятся эти новые грамматики или вы ненавидите эти новые грамматики, слишком ленивы, чтобы идти.GitHub
говорить на английском.
Ссылка была размещена для всех, это зависит от того, все ли в настроении присоединиться к веселью, или если вы нажмете на ссылку, чтобы смело выразить свой голос. Конечно, если вы идетеGitHub
Мы все еще должны говорить по-английски, хотя мы можем понять его, даже если мы говорим по-китайски, область комментариев не полностью китайская.Vue
Иностранных фанатов по-прежнему немало. И они не все американцы, те разработчики, которые не являются британскими американцами, если они только хотят быть счастливыми и говорить на родном языке своей страны, у нас не должно быть возможности общаться, и это еще больше сблизит китайцев с миром. Изображение за границей: все остальные говорят по-английски, но вы, китайцы, говорите на своем родном языке и не соблюдаете правила.
Тогда могут быть люди с очень плохим уровнем английского Мы можем сделать это: найти Baidu Translate, ввести китайский язык, перевести его на английский, а затем скопировать английский. Хотя перевод может быть не совсем точным, по крайней мере, он может доходить до точки едва понимания. В то же время другой метод заключается в том, чтобы перевести предложения, переведенные на английский язык, а затем перевести их обратно на китайский язык, чтобы увидеть, где значительно изменилась семантика, а затем мы можем переписать их самостоятельно.
Если вам нравится этот синтаксис, дайте ему еще несколько лайков и еще несколько комплиментов, и он скоро будет включен.Vue
внутри стандартного синтаксиса.
Если вам это не нравится, то продолжайте и добавьте еще несколько слов, и от этой грамматики, скорее всего, откажутся, как и от первой волны предложений синтаксического сахара.
Если вы чувствуете, что не имеет значения, что вы любите, перейдите кGitHub
Как хлопотно совершить поездку, и как удобно комментировать прямо под этим постом. Тогда вы также можете оставить сообщение в области комментариев.
Эта статья была впервые опубликована в публичном аккаунте:предварительное обучение
Замечательные статьи в прошлом
- «[Перевод] Официальный член Vue: как развивается экосистема Vite?»
- "UI: У вас есть какие-нибудь причудливые библиотеки компонентов, на которые я мог бы сослаться? 》
- «Вопросы на собеседовании по макету мобильного терминала всесторонне изучают ваши навыки CSS (в центре)»
- «Использование суперпопулярной библиотеки React CSS-in-JS в проектах Vue: стилизованные компоненты»
- «Создайте собственную визуальную карту данных, не полагаясь на какую-либо библиотеку»
- «VUE вторая волна ударила предложение REF грамматики, вступает в стандарты? 》
- «You Yuxi Foreign Tutorial: я возьму вас, чтобы написать простую версию Vue! 》
- «Менеджер по продукту: Начальная анимация Hongmeng очень красивая, дайте нам целую страницу»
- "Менеджер по продукту: Вы можете сделать так, чтобы эта строка чисел прокручивалась? 》
- «[Перевод] Юси Ю: Vue3 не будет поддерживать IE11, энергия будет вложена в Vue2.7»
- «Супер забавная новая функция Vue: введение переменных JS в CSS»
- "какие? Можно ли добиться эффекта втягивания только с помощью тега H5? 》
- «Исправьте нецивилизованное явление Github! Microsoft запускает раздел комментариев! 》
- «Золотой ③ Серебряный ④ Поделитесь вопросом интервью, который заставил меня перевернуться»
- «Двойной 11 маленький черный ящик — это очень круто? Давайте улучшим его с помощью переменных CSS! 》
- «Не стоит недооценивать Цзюгунге, один вопрос может раскрыть истинную форму кандидата! 》
- «Серия запутанных действий после установки объекта-прототипа на прокси»
- «Супер забавная новая функция Vue: портал DOM»
- «Наконец-то настала очередь Vue вдохновлять React? 》
- «Небольшая яма Vue3 под IOS»
- «[Перевод] Юси Ю: Процесс проектирования Vue3»