定制响应式数据" >Die Vergleichstabelle der drei Implementierungsprinzipien lautet wie folgt, um Ihnen zu helfen, den Unterschied zwischen den drei Arten der Reaktionsfähigkeit zu verstehen实现原理 defineProperty Proxy value setter 实际场景 Vue 2 响应式 Vue 3 reactive Vue 3 ref 优势 兼容性 基于proxy实现真正的拦截 实现简单 劣势 数组和属性删除等拦截不了 兼容不了 IE11 只拦截了 value 属性 实际应用 Vue 2 Vue 3 复杂数据结构 Vue 3 简单数据结构
定制响应式数据
Was ist der reaktive Mechanismus in Vue3?
Was ist Reaktionsfähigkeit? Reaktionsfähigkeit war schon immer eine der besonderen Eigenschaften von Vue; im Gegensatz dazu haben Variablen in JavaScript nicht das Konzept der Reaktionsfähigkeit, das Ihnen beim Erlernen von JavaScript vermittelt wird Das heißt, der Code wird von oben nach unten ausgeführt.
Schauen wir uns den folgenden Code an. Die beiden ausgegebenen Double-Ergebnisse sind auch 2, auch nachdem wir den Wert von count im Code geändert haben Der Wert wird sich nicht ändernlet count = 1 let double = count * 2 count = 2
let count = 1 // 计算过程封装成函数 let getDouble = n=>n*2 //箭头函数 let double = getDouble(count) count = 2 // 重新计算double ,这里我们不能自动执行对double的计算 double = getDouble(count)
Tatsächliche Entwicklung Die Berechnungslogik wird viel komplizierter sein als die Berechnung von double, aber sie kann zur Ausführung in eine Funktion gekapselt werden. Als nächstes müssen wir überlegen, wie der Wert von double automatisch berechnet werden kann
Wenn wir können Lassen Sie die getDouble-Funktion automatisch ausführen. Das heißt, wie in der folgenden Abbildung gezeigt, verwenden wir einen bestimmten Mechanismus von JavaScript, um die Zählung mit einer Ebene zu umschließen, und der Wert des Doubles wird synchron aktualisiert ein Double, das sich automatisch mit der Änderung der Zählung ändert. Es fühlt sich an, als wäre dies der Prototyp der Reaktionsfähigkeit. Es gibt drei reaktionsfähige Lösungen, die in Vue verwendet werden, nämlich defineProperty, Proxy und Value Setter. Schauen wir uns zunächst die defineProperty-API von Vue 2 an. Im folgenden Code definieren wir ein Objekt, das wir als Proxy verwenden das Zählattribut; auf diese Weise fangen wir das Wertattribut des obj-Objekts ab, führen die Get-Funktion aus, wenn wir das Zählattribut lesen, führen die Set-Funktion aus, wenn wir das Count-Attribut ändern, und berechnen das Double innerhalb der Set-Funktion neu Auf diese Weise haben wir eine einfache reaktionsfähige Funktion implementiert. Im vierten Teil des Kurses werde ich Sie auch dazu bringen, ein vollständigeres reaktionsfähiges System zu schreiben
Aber die defineProperty API implementiert das Prinzip der Reaktionsfähigkeit als Vue 2. Es gibt auch einige Fehler in der Syntax; wenn wir beispielsweise im folgenden Code das Attribut obj.count löschen, wird die Set-Funktion nicht ausgeführt und der Double-Wert ist immer noch der vorherige Wert. Aus diesem Grund benötigen wir in Vue 2 einen Spezielle Funktion zum Löschen von Daten
let getDouble = n=>n*2 let obj = {} let count = 1 let double = getDouble(count) Object.defineProperty(obj,'count',{ get(){ return count }, set(val){ count = val double = getDouble(val) } }) console.log(double) // 打印2 obj.count = 2 console.log(double) // 打印4 有种自动变化的感觉
Der reaktive Mechanismus von Vue 3 basiert auf dem Namen Proxy. Sie können auch sehen, dass er Proxy bedeutet. Die wichtige Bedeutung von Proxy besteht darin, dass er die Mängel der Reaktionsfähigkeit von Vue 2 behebt Schauen Sie sich den folgenden Code an, in dem wir das Objekt obj über einen neuen Proxy vertreten und dann die Lese-, Änderungs- und Löschvorgänge des Objekts über die Funktionen get, set und deleteProperty vertreten und so die Reaktionsfunktion realisieren
delete obj.count console.log(double) // doube还是4
Wir beginnen mit Hier ist ersichtlich, dass die von Proxy implementierte Funktion der definePropery von Vue 2 ähnelt. Sie können die Set-Funktion auslösen, wenn der Benutzer die Daten ändert, wodurch die Funktion der automatischen Aktualisierung des Doubles realisiert wird. Darüber hinaus hat Proxy auch mehrere Mängel von definePropery behoben. Beispielsweise kann der Proxy das Löschen von Objekten und nicht von bestimmten Eigenschaften überwachen, sodass er nicht nur Proxy-Eigenschaften überwachen kann, die zum Zeitpunkt ihrer Definition nicht vorhanden sind Datenstrukturen wie Map, Set usw., und wir können den Löschvorgangs-Proxy auch über deleteProperty implementieren
Um Ihnen das Verständnis von Proxy zu erleichtern, können wir natürlich auch doppelt verwandten Code in die Set- und deleteProperty-Funktionen schreiben In der zweiten Hälfte des Kurses werde ich Sie zu einer vollständigeren Kapselung führen. Im folgenden Code kann die reaktive Funktion von Vue 3 ein Objekt in reaktionsfähige Daten umwandeln, und wir implementieren die reaktive Funktion Sie können watchEffect auch zum Drucken von Daten nach dem Ändern von obj.count
let proxy = new Proxy(obj,{ get : function (target,prop) { return target[prop] }, set : function (target,prop,value) { target[prop] = value; if(prop==='count'){ double = getDouble(value) } }, deleteProperty(target,prop){ delete target[prop] if(prop==='count'){ double = NaN } } }) console.log(obj.count,double) proxy.count = 2 console.log(obj.count,double) delete proxy.count // 删除属性后,我们打印log时,输出的结果就会是 undefined NaN console.log(obj.count,double)
import {reactive,computed,watchEffect} from 'vue' let obj = reactive({ count:1 }) let double = computed(()=>obj.count*2) obj.count = 2 watchEffect(()=>{ console.log('数据被修改了',obj.count,double.value) })
Die Vergleichstabelle der drei Implementierungsprinzipien lautet wie folgt, um Ihnen zu helfen, den Unterschied zwischen den drei Arten der Reaktionsfähigkeit zu verstehen实现原理 defineProperty Proxy value setter 实际场景 Vue 2 响应式 Vue 3 reactive Vue 3 ref 优势 兼容性 基于proxy实现真正的拦截 实现简单 劣势 数组和属性删除等拦截不了 兼容不了 IE11 只拦截了 value 属性 实际应用 Vue 2 Vue 3 复杂数据结构 Vue 3 简单数据结构
定制响应式数据
简单入门响应式的原理后,接下来我们学习一下响应式数据在使用的时候的进阶方式;我们看下使用 <script setup>
重构之后的 todolist 的代码;这段代码使用 watchEffect,数据变化之后会把数据同步到 localStorage 之上,这样我们就实现了 todolist 和本地存储的同步
import { ref, watchEffect, computed } from "vue";
let title = ref("");
let todos = ref(JSON.parse(localStorage.getItem('todos')||'[]'));
watchEffect(()=>{
localStorage.setItem('todos',JSON.stringify(todos.value))
})
function addTodo() {
todos.value.push({
title: title.value,
done: false,
});
title.value = "";
}
Nach dem Login kopieren更进一步,我们可以直接抽离一个 useStorage 函数,在响应式的基础之上,把任意数据响应式的变化同步到本地存储;我们先看下面的这段代码,ref 从本地存储中获取数据,封装成响应式并且返回,watchEffect 中做本地存储的同步,useStorage 这个函数可以抽离成一个文件,放在工具函数文件夹中
function useStorage(name, value=[]){
let data = ref(JSON.parse(localStorage.getItem(name)||'[]'))
watchEffect(()=>{
localStorage.setItem(name,JSON.stringify(data.value))
})
return data
}
Nach dem Login kopieren在项目中我们使用下面代码的写法,把 ref 变成 useStorage,这也是 Composition API 最大的优点,也就是可以任意拆分出独立的功能
let todos = useStorage('todos',[])
function addTodo() {
...code
}
Nach dem Login kopieren现在,你应该已经学会了在 Vue 内部进阶地使用响应式机制,去封装独立的函数;在后续的实战应用中,我们也会经常对通用功能进行封装;如下图所示,我们可以把日常开发中用到的数据,无论是浏览器的本地存储,还是网络数据,都封装成响应式数据,统一使用响应式数据开发的模式;这样,我们开发项目的时候,只需要修改对应的数据就可以了

基于响应式的开发模式,我们还可以按照类似的原理,把我们需要修改的数据,都变成响应式;比如,我们可以在 loading 状态下,去修改浏览器的小图标 favicon;和本地存储类似,修改 favicon 时,我们需要找到 head 中有 icon 属性的标签
在下面的代码中,我们把对图标的对应修改的操作封装成了 useFavicon 函数,并且通过 ref 和 watch 的包裹,我们还把小图标变成了响应式数据
import {ref,watch} from 'vue'
export default function useFavicon( newIcon ) {
const favicon = ref(newIcon)
const updateIcon = (icon) => {
document.head
.querySelectorAll(`link[rel*="icon"]`)
.forEach(el => el.href = `${icon}`)
}
watch( favicon,
(i) => {
updateIcon(i)
}
)
return {favicon,reset}
}
Nach dem Login kopieren这样在组件中,我们就可以通过响应式的方式去修改和使用小图标,通过对 faivcon.value 的修改就可以随时更换网站小图标;下面的代码,就实现了在点击按钮之后,修改了网页的图标为 geek.png 的操作
<script setup>
import useFavicon from './utils/favicon'
let {favicon} = useFavicon()
function loading(){
favicon.value = '/geek.png'
}
</script>
<template>
<button @click="loading">123</button>
</template>
Nach dem Login kopieren
Vueuse 工具包
我们自己封装的 useStorage,算是把 localStorage 简单地变成了响应式对象,实现数据的更新和localStorage 的同步;同理,我们还可以封装更多的类似 useStorage 函数的其他 use 类型的函数,把实际开发中你用到的任何数据或者浏览器属性,都封装成响应式数据,这样就可以极大地提高我们的开发效率
Vue 社区中其实已经有一个类似的工具集合,也就是 VueUse,它把开发中常见的属性都封装成为响应式函数
VueUse 趁着这一波 Vue 3 的更新,跟上了响应式 API 的潮流;VueUse 的官方的介绍说这是一个 Composition API 的工具集合,适用于 Vue 2.x 或者 Vue 3.x,用起来和 React Hooks 还挺像的
在项目目录下打开命令行里,我们输入如下命令,来进行 VueUse 插件的安装:
npm install @vueuse/core
Nach dem Login kopieren然后,我们就先来使用一下 VueUse;在下面这段代码中,我们使用 useFullscreen 来返回全屏的状态和切换全屏的函数;这样,我们就不需要考虑浏览器全屏的 API,而是直接使用 VueUse 响应式数据和函数就可以很轻松地在项目中实现全屏功能
<template>
<h2 id="click">click</h2>
</template>
<script setup>
import { useFullscreen } from '@vueuse/core'
const { isFullscreen, enter, exit, toggle } = useFullscreen()
</script>
Nach dem Login kopieren
useFullscreen 的封装逻辑和 useStorage 类似,都是屏蔽了浏览器的操作,把所有我们需要用到的状态和数据都用响应式的方式统一管理,VueUse 中包含了很多我们常用的工具函数,我们可以把网络状态、异步请求的数据、动画和事件等功能,都看成是响应式的数据去管理。
Das obige ist der detaillierte Inhalt vonWas ist der reaktive Mechanismus in Vue3?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
<script setup>
重构之后的 todolist 的代码;这段代码使用 watchEffect,数据变化之后会把数据同步到 localStorage 之上,这样我们就实现了 todolist 和本地存储的同步import { ref, watchEffect, computed } from "vue"; let title = ref(""); let todos = ref(JSON.parse(localStorage.getItem('todos')||'[]')); watchEffect(()=>{ localStorage.setItem('todos',JSON.stringify(todos.value)) }) function addTodo() { todos.value.push({ title: title.value, done: false, }); title.value = ""; }
function useStorage(name, value=[]){ let data = ref(JSON.parse(localStorage.getItem(name)||'[]')) watchEffect(()=>{ localStorage.setItem(name,JSON.stringify(data.value)) }) return data }
let todos = useStorage('todos',[]) function addTodo() { ...code }

import {ref,watch} from 'vue' export default function useFavicon( newIcon ) { const favicon = ref(newIcon) const updateIcon = (icon) => { document.head .querySelectorAll(`link[rel*="icon"]`) .forEach(el => el.href = `${icon}`) } watch( favicon, (i) => { updateIcon(i) } ) return {favicon,reset} }
<script setup> import useFavicon from './utils/favicon' let {favicon} = useFavicon() function loading(){ favicon.value = '/geek.png' } </script> <template> <button @click="loading">123</button> </template>
npm install @vueuse/core
<template> <h2 id="click">click</h2> </template> <script setup> import { useFullscreen } from '@vueuse/core' const { isFullscreen, enter, exit, toggle } = useFullscreen() </script>

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



vue3+vite:src verwendet „require“, um Bilder dynamisch zu importieren, und vue3+vite importiert dynamisch mehrere Bilder. Wenn Sie „requireisnotdefined“ verwenden, wird eine Fehlermeldung angezeigt like vue2 like imgUrl:require(' .../assets/test.png') wird importiert, da Typescript Require nicht unterstützt, daher wird Import verwendet. So lösen Sie das Problem: Verwenden Sieawaitimport

tinymce ist ein voll funktionsfähiges Rich-Text-Editor-Plug-in, aber die Einführung von tinymce in Vue ist nicht so reibungslos wie bei anderen Vue-Rich-Text-Plug-ins. Tinymce selbst ist nicht für Vue geeignet, und @tinymce/tinymce-vue muss eingeführt werden. und Es handelt sich um ein ausländisches Rich-Text-Plug-in, das die chinesische Version nicht bestanden hat. Sie müssen das Übersetzungspaket von der offiziellen Website herunterladen (möglicherweise müssen Sie die Firewall umgehen). 1. Installieren Sie die zugehörigen Abhängigkeiten npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2. 3. Führen Sie den Skin und das chinesische Paket ein. Erstellen Sie einen neuen Tinymce-Ordner im öffentlichen Ordner des Projekts und laden Sie ihn herunter

Um eine teilweise Aktualisierung der Seite zu erreichen, müssen wir nur das erneute Rendern der lokalen Komponente (dom) implementieren. In Vue lässt sich dieser Effekt am einfachsten mit der v-if-Direktive erzielen. In Vue2 können wir zusätzlich zur Verwendung der v-if-Anweisung zum erneuten Rendern des lokalen Doms auch eine neue leere Komponente erstellen. Wenn wir die lokale Seite aktualisieren müssen, springen wir zu dieser leeren Komponentenseite und springen dann wieder hinein der beforeRouteEnter-Schutz in der leeren Komponente. Wie in der Abbildung unten gezeigt, wie man in Vue3.X auf die Schaltfläche „Aktualisieren“ klickt, um das DOM im roten Feld neu zu laden und den entsprechenden Ladestatus anzuzeigen. Da der Guard in der Komponente in der scriptsetup-Syntax in Vue3.X nur o hat

Um das Blog-Frontend mit Vue zu implementieren, müssen Sie die Markdown-Analyse implementieren. Wenn Code vorhanden ist, müssen Sie die Code-Hervorhebung implementieren. Es gibt viele Markdown-Parsing-Bibliotheken für Vue, wie z. B. markdown-it, vue-markdown-loader, markiert, vue-markdown usw. Diese Bibliotheken sind alle sehr ähnlich. Hier wird Markiert verwendet, und highlights.js wird als Code-Hervorhebungsbibliothek verwendet. Die spezifischen Implementierungsschritte lauten wie folgt: 1. Installieren Sie abhängige Bibliotheken. Öffnen Sie das Befehlsfenster unter dem Vue-Projekt und geben Sie den folgenden Befehl ein: npminstallmarked-save//marked, um Markdown in htmlnpmins zu konvertieren

Nachdem das vue3-Projekt gepackt und auf dem Server veröffentlicht wurde, wird auf der Zugriffsseite eine leere 1 angezeigt. Der publicPath in der Datei vue.config.js wird wie folgt verarbeitet: const{defineConfig}=require('@vue/cli-service') module.exports=defineConfig({publicPath :process.env.NODE_ENV==='produktion'?'./':'/&

Der letzte Effekt besteht darin, die VueCropper-Komponente „garnaddvue-cropper@next“ zu installieren. Wenn es sich um Vue3 handelt oder Sie andere Methoden als Referenz verwenden möchten, besuchen Sie bitte die offizielle npm-Adresse. Es ist auch sehr einfach, es in einer Komponente zu referenzieren und zu verwenden. Sie müssen nur die entsprechende Komponente und ihre Stildatei einführen. Ich verweise hier nicht global, sondern nur auf import{userInfoByRequest}from'../js/api ' in meiner Komponentendatei. import{VueCropper}from'vue-cropper&

vue3+ts+axios+pinia realisiert sinnlose Aktualisierung 1. Laden Sie zuerst aiXos und pinianpmipinia im Projekt herunter--savenpminstallaxios--save2. AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

Vorwort Ob Vue oder React: Wenn wir auf mehrere wiederholte Codes stoßen, werden wir darüber nachdenken, wie wir diese Codes wiederverwenden können, anstatt eine Datei mit einer Reihe redundanter Codes zu füllen. Tatsächlich können sowohl Vue als auch React eine Wiederverwendung durch Extrahieren von Komponenten erreichen. Wenn Sie jedoch auf einige kleine Codefragmente stoßen und keine andere Datei extrahieren möchten, kann React im Vergleich dazu verwendet werden Deklarieren Sie das entsprechende Widget in der Datei , oder implementieren Sie es über die Renderfunktion, wie zum Beispiel: constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(
