я писал на прошлой неделеУчебник по React для пользователей Vue, вы это заслужили, был хорошо принят друзьями, сегодняшняя статья — вторая статья в этой серии. Эти годы9月18日
инцидент 18 сентября89
Юбилей, и в этот день,Vue3.0
Официальная версия выпущена. Я уверен, что многие из вас видели этоVue3.0
Есть много статей по теме. Сегодняшняя статья будетVue2
,Vue3
,React
Некоторые из обычаев сравниваются, что удобно для изучения друзьями.
данныеdata
,существуетreact
средняя ставкаstate
знакомыйvue
приятель должен быть правVue
серединаdata
Во всяком случае, я не буду чувствовать себя незнакомым, я пишу каждый деньBug
использовать в любое время, но дляdata
Например, вVue2.0
,Vue3.0
,React
Использование отличается, мы приведем пример ниже
Vue2.0
использование в
Следующий код является относительно простымVue2.0
изdata
Применение
<template>
<div>{{ name }}</div>
</template>
<script>
export default {
data() {
return {
name: '子君',
gzh: '前端有的玩'
}
}
}
</script>
Из вышеуказанного кода мы можем увидетьdata
является функцией, а затем функция возвращает объект, так почемуdata
Это функция? Например, мы иногдаApp.vue
видно в файлеdata
Не в случае с функциями.
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
data:{
name: '子君',
sex: '男'
}
}
</script>
Так почему же мы должны поставитьdata
Как насчет объявления его как функции?Vue
Официальный сайт объясняет это так: когдакомпонентыопределено,data
Должна быть объявлена как функция, возвращающая исходный объект данных, поскольку компонент может использоваться для создания нескольких экземпляров. еслиdata
по-прежнему является чистым объектом, то все экземпляры будутобщая ссылкаТот же объект данных! путем предоставленияdata
функция, каждый раз, когда создается новый экземпляр, мы можем вызыватьdata
функция, которая возвращает новую копию объекта данных исходных данных.
а такжеApp.vue
могуdata
объявлен как обычный объект, потому что вся системаApp.vue
Он будет использоваться только один раз, поэтому такой проблемы нет.
Vue3
использование в
существуетVue3
, мы еще можемVue2
использовать таким образомdata
,КонечноVue3
предоставляет новыеComposition API
, в последующих статьях, если нет особого указания, упоминаемVue3
По умолчанию это означает использованиеComposition API
.
существуетComposition API
ОтзывчивыйAPI
, соответственноref
а такжеreactive
, через эти дваAPI
Может генерировать отзывчивые данные
Основное использование
<template>
<div class="home">
<div>姓名:{{ state.name }}</div>
<div>公众号:{{ state.gzh }}</div>
<div>统计:{{ count }}</div>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, ref } from "vue";
export default defineComponent({
name: "Home",
setup() {
const state = reactive({
name: "子君",
gzh: "前端有的玩"
});
const count = ref(0);
return {
state,
count
};
}
});
</script>
Реагирование на изменения данных
существуетVue2.0
, мы модифицируемdata
обычно используется методthis.name = '张三'
Этот способ присвоения, но дляComposition API
потому что он обеспечивает дваapi
, поэтому использование немного отличается
<template>
<div class="home" @click="handleClick">
<div>姓名:{{ state.name }}</div>
<div>公众号:{{ state.gzh }}</div>
<div>统计:{{ count }}</div>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, ref } from "vue";
export default defineComponent({
setup() {
const state = reactive({
name: "子君",
gzh: "前端有的玩"
});
const count = ref(0);
function handleClick() {
state.name = "张三";
count.value++;
}
return {
state,
count,
handleClick
};
}
});
</script>
Как показано в коде выше:
-
для
reactive
заявленные данныедля
reactive
, мы можем пройтиstate.name
чтобы получить данные, затем перейдитеstate.name='张三'
изменить данные -
для
ref
заявленные данныедля
ref
заявленные данные,ref
Принимает значение параметра и возвращает реактивный и изменяемый объект ссылки. Объекты ref имеют одно свойство, указывающее на внутреннее значение.value
. Итак, мы получаем кодref
Данные объекта необходимо использоватьcount.value
Кстати, способ изменения значения также должен пройтиcount.value++
Путь.Но тут есть особый момент
template
,ref
Объект будет автоматически развернут, что означает, что для<div>统计:{{ count }}</div>
, который можно использовать прямо в кодеcount
, вместо того, чтобы быть записанным какcount.value
,Vue
распаковывает какcount.value
.
React
использование в
React16.8
недавно добавленныйHook
функция, многие команды уже использовали ее в больших масштабах, поэтому содержание этой статьи в большей степени основано наHook
основной.
существуетVue3.0
предоставлено вComposition API
, на самом деле это иReact
изhook
Использование очень похоже, далее мы напишем то, что написали вышеVue3.0
Код изменен наReact
Версия
import React, { useState } from 'react'
export default function() {
// useState传入要初始化的状态数据,然后会返回一个数组
// 数组第一项为声明的数据,而第二个参数是一个方法,用于调用
// 修改数据
const [name, setName] = useState('子君')
const [gzh] = useState('前端有的玩')
function handleClick() {
// 在react修改数据需要调用useState返回的方法
setName('张三')
}
return (
<div onClick={handleClick}>
<div>姓名:{name}</div>
<div>公众号: {gzh}</div>
</div>
);
}
В этом коде мы используемuseState
объявилstate
Переменная,useState
Возвращаемое значение представляет собой массив, а затем мы получаем две переменные посредством деструктуризации массива, const [name, setName] = useState('子君')
, вname
соответствующий заявлениюstate
переменная иsetName
это функция, которая вызываетsetName
Вы можете изменить значение переменной, напримерsetName('张三')
,В этот моментname
значение станет张三
слушательwatch
, нет ничего плохого в том, чтобы следить за вами
Xiaobian чаще используется при нормальном развитииwatch
использованиеwatch
Вы можете прослушивать изменения в данных, а затем выполнять ряд операций после изменений. Например, есть страница списка, мы надеемся, что когда пользователь вводит ключевое слово для поиска, поиск может запускаться автоматически. В это время, в дополнение к мониторингу поля вводаinput
Помимо событий, вы также можетеvue
изwatch
отслеживать изменения в ключевых словах
Vue2.0
правописание в
существуетvue2.0
середина,watch
Существует два широко используемых метода записи.Ниже мы используем различные методы записи для реализации вышеуказанных функций.
-
Регулярная реализация
<template> <div> <div> <span>搜索</span> <input v-model="searchValue" /> </div> <!--列表,代码省略--> </div> </template> <script> export default { data() { return { searchValue: '' } }, watch: { // 在值发生变化之后,重新加载数据 searchValue(newValue, oldValue) { // 判断搜索 if (newValue !== oldValue) { // 在这里处理搜索逻辑 } } } } </script>
-
использовать
$watch
выполнить<template> <div> <div> <span>搜索</span> <input v-model="searchValue" /> </div> <!--列表,代码省略--> </div> </template> <script> export default { data() { return { searchValue: '' } }, created() { // $watch会返回一个unwatch函数,如果需求上需要在某些场景取消watch,可以执行`unwatch` const unwatch = this.$watch('searchValue', (newValue, oldValue) => { // 判断搜索 if (newValue !== oldValue) { // 在这里处理搜索逻辑 } }) } } </script>
вызов
$watch
, будет возвращаемое значениеunwatch
, а затем, если нам нужно отменить прослушивание просмотра, мы можем вызватьunwatch
Например, если есть форма, кнопка сохранения в форме обычно неактивна, но если пользователь изменяет форму, неактивное состояние формы необходимо изменить на активное. Но если форма уже включена, продолжать не нужно.watch
, то нужно использоватьunwatch
Vue3.0
правописание в
существуетVue3.0
КромеVue2.0
Помимо правописания вComposition API
при условииwatch
а такжеwatchEffect
дваAPI
, используемый для отслеживания изменений в данных, мы будем использовать вышеперечисленные поиски отдельноwatch
а такжеwatchEffect
реализовать
-
watch
Метод реализации
<template>
<div>
<span>搜索</span>
<input v-model="state.searchValue" />
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, watch } from "vue";
export default defineComponent({
setup() {
const state = reactive({
searchValue: ""
});
// 通过watch来监听searchValue的变化
const unwatch = watch(
() => state.searchValue,
(value, oldValue) => {
if (value !== oldValue) {
// 在这里处理搜索逻辑
}
}
);
return {
state
};
}
});
</script>
watch API
а такжеVue2.0
серединаthis.$watch
Использование в основном такое же, включая используемые параметры и т. д.watch API
вернулсяunwatch
функция отменыwatch
в то же времяwatch
Вы также можете прослушивать изменения в нескольких свойствах, например
watch([a,b,c], ([a,b,c],[oldA,oldB,oldC]) => {
})
-
watchEffect
выполнитьwatchEffect
Параметр представляет собой функцию, которая будет выполняться сразу после выполнения кода.watchEffect
Передаваемая функция затем реактивно отслеживает свои зависимости и повторно запускает функцию, если некоторые из этих зависимостей изменяются. Мы используем приведенный выше код поиска, используяwatchEffect
реализоватьexport default defineComponent({ setup() { const state = reactive({ searchValue: "" }); // 加载数据 function loadData(searchValue){ } // 通过watchEffect来监听searchValue的变化 const unwatch = watchEffect(() => { // 当代码执行到watchEffect时,会立即调用此函数,同时会收集到存在 //`state.searchValue`的依赖,然后当`state.searchValue`发生 //变化时会在此调用watchEffect,已实现数据监听 loadData(state.searchValue) }); return { state }; } })
React
использование в
существуетReact
нейтральныйwatch
Более похожая функцияEffect Hook
, его использование позволяет выполнять побочные эффекты в функциональных компонентах, давайте сначала посмотрим на код
import React, { useEffect, useState } from 'react'
export default function() {
// useState传入要初始化的状态数据,然后会返回一个数组
// 数组第一项为声明的数据,而第二个参数是一个方法,用于调用
// 修改数据
const [searchValue, setSearchValue] = useState('')
function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
// 在react修改数据需要调用useState返回的方法
setSearchValue(e.target.value);
}
// useEffect接受两个参数,第一个是回调函数,第二个是要监听变化的属性,是一个数组
useEffect(() => {
// 当代码首次调用useEffect会进入这个回调函数,然后
// 当serchValue 发生变化时,会再次进入到这里
console.log(111)
},[searchValue])
return (
<div>
<input value={searchValue} onChange={handleChange}></input>
</div>
);
}
Как и в приведенном выше коде, мы используемuseEffect
контролироватьsearchValue
изменяется, а затем срабатывает новая логика, но, увидев вышеприведенный код, мы не нашли отменуeffect
метод, так как его отменить?
useEffect
Второй параметр — это массив, мониторинг данных реализован передачей в массив переменной, которую нужно отслеживать, но отменить этот мониторинг нет возможности, поэтому нам нужно сохранять страну по кривой, как в следующем коде
const [isWatch] = useState(true)
useEffect(() => {
// 通过isWatch来判断是否进行监听逻辑变化
if(isWatch) {
// 监听数据变化
console.log(searchValue)
}
},[isWatch, searchValue])
Расчетные свойства, вReact
Я также нашел следы в
Vue
Я полагаю, что все знакомы с вычисляемыми свойствами вtemplate
Упростите сложные логические вычисления вfirstName
а такжеlastName
Тогда интерфейс будет над ним,firstName
а такжеlastName
Отображаемые вместе, вы можете использовать вычисляемое свойство для обработки отображения
Vue2.0
правописание в
<template>
<div>
<div>
<label>firstName</label>
<input v-model="firstName" />
<label>lastName</label>
<input v-model="lastName" />
</div>
<div>用户名:{{ name }}</div>
</div>
</template>
<script>
export default {
data() {
return {
firstName: '',
lastName: ''
}
},
computed: {
name() {
return this.firstName + '·' + this.lastName
}
}
}
</script>
Vue3.0
правописание в
существуетVue3.0
изComposition API
также обеспечиваетcomputed API
, используемый для создания вычисляемых свойств, используется так же, какVue2.0
Использование в основном такое же
import { computed, defineComponent, reactive } from "vue";
export default defineComponent({
setup() {
const state = reactive({
firstName: "",
lastName: ""
});
const name = computed(() => state.firstName + "·" + state.lastName);
return {
state,
name
};
}
});
React
правописание в
говоря оReact
Перед моделированием вычисляемых свойств вReact Hook
правило.
- Можно использовать только на верхнем уровне
Hook
- только в
React
вызов функцииHook
когда мыReact
используется в функцииuseState
После этого, если мы пройдемsetState
отредактированоstate
, то на этот разreact
Что будет сделано?React
повторно выполнит этот функциональный компонент, но для внутреннейuseState
,useEffect
и т. д. не будут повторно инициализированы, а будут обрабатываться с использованием уже зарегистрированного состояния. ТакReact
откуда ты знаешь какойstate
что соответствуетuseState
Шерстяная ткань? ответReact
полагаться наHook
порядок звонков. Таким образом, у нас не может быть не высшего уровня, например.if
внутри использованиеHook
.
В то же время? потому чтоstate
Изменение вызовет перевыполнение всей функции, тогда если мы пропишем такой кусок логики в коде
const [firstName, setFirstName] = useState('')
const [lastName, setLastName ] = useState('')
const [other,setOther] = useState('')
// 使用 useMemo可以模仿Vue中的计算属性
const name = firstName + "·" + lastName;
В приведенном выше коде нашname
черезfirstName
а такжеlastName
рассчитано, то когдаfirstName
илиlastName
При возникновении изменений они будут пересчитаныname
, логика правильная. Но по фактуother
Если произойдут изменения, это также приведет кname
Пересчет, который мы не хотим видеть. еслиname
Логика вычислений очень сложная, тогда это вызовет ненужные затраты на производительность. такReact
при условииuseMemo
, используется, чтобы избежать изменений в логике вычислений, вызванных изменениями несвязанных атрибутов, и мы можем просто использоватьuseMemo
Чтобы имитировать вычисляемые свойства, следующий код
import React, { useMemo, useState } from 'react'
export default function() {
const [firstName, setFirstName] = useState('')
const [lastName, setLastName ] = useState('')
// 使用 useMemo可以模仿Vue中的计算属性,当firstName与`lastName`任何一个发生变化
//都会触发`name`重新计算,但是对于其他属性变化,并不会引起重新计算
const name = useMemo(() => firstName + '·' + lastName,[firstName,lastName])
const handleChange = (method: Function, e: React.ChangeEvent<HTMLInputElement> ) => {
method(e.target.value)
}
return (
<div>
<div>
<label>firstName</label>
<input
value={firstName}
onChange={(e) => handleChange(setFirstName, e)}
/>
<label>lastName</label>
<input
value={lastName}
onChange={(e) => handleChange(setLastName, e)}
/>
</div>
<div>用户名:{name}</div>
</div>
);
}
Но вVue
Вычисляемое свойство может либоget
, также можноset
, который мы не можем использоватьuseMemo
Конечно, для моделирования, если маленький партнер знает, как моделировать, сообщите мне об этом в области комментариев ниже, спасибо.
Суммировать
Front-end технология развивается с каждым днем, я сказал, что не могу больше этому учиться, но я не научился зарабатывать деньги и есть, поэтому мне все равно придется этому учиться. Как один из трех основных интерфейсных фреймворковVue
а такжеReact
, по-прежнему очень часто используется в повседневной работе.Благодаря этому сравнительному исследованию можно лучше совместить их для облегчения памяти. Эта статья была впервые опубликована в общедоступном аккаунте** [небольшая игра во внешнем интерфейсе], изучите интерфейс, пройдите собеседование, чтобы найти работу, просто в[Некоторая игра на переднем конце]**