Inhaltsverzeichnis
Vue3.2 setup语法糖
1.<script setup>在<template/>使用
2、<script setup>引入组件将自动注册
3、组件通信:
defineProps 代替props
defineEmit 代替emit
4.<script setup>需主动向父组件暴露子组件属性 :defineExpose
5.语法糖其他功能
6.在setup访问路由
Heim Web-Frontend View.js Wie verwendet Vue3 den Setup-Syntaxzucker, um das Schreiben von Return zu verweigern?

Wie verwendet Vue3 den Setup-Syntaxzucker, um das Schreiben von Return zu verweigern?

May 12, 2023 pm 06:34 PM
vue3 return setup

    Vue3.2 setup语法糖

    <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖

    解决Vue3.0中setup需要繁琐将声明的变量、函数以及 import 引入的内容通过return向外暴露,才能在<template/>使用的问题

    1.<script setup>在<template/>使用

    <script setup>中无需return 声明的变量、函数以及import引入的内容,即可在<template/>使用

    <script setup>语法糖

    <script setup>
    //import引入的内容
    import { getToday } from &#39;./utils&#39;  
    // 变量
    const msg = &#39;Hello!&#39;
    // 函数
    function log() {
      console.log(msg)
    }
    </script>
    
    //在template中直接使用声明的变量、函数以及import引入的内容
    <template>
      <div @click="log">{{ msg }}</div>
       <p>{{getToday()}}</p>
    </template>
    Nach dem Login kopieren

    标准组件<script> 需要写setup函数并繁琐retrun

    <script>
    //import引入的内容
    import { getToday } from &#39;./utils&#39;  
    export default{
     setup(){
        // 变量
        const msg = &#39;Hello!&#39;
        // 函数
        function log() {
          console.log(msg)
        }
        //想在tempate里面使用需要在setup内return暴露出来
        return{
           msg,
           log,
           getToday 
        }
     }
    }
    </script>
    
    <template>
      <div @click="log">{{ msg }}</div>
       <p>{{getToday()}}</p>
    </template>
    Nach dem Login kopieren

    小结:<script setup>语法糖里面的代码会被编译成组件 setup() 函数的内容,不需要通过return暴露 声明的变量、函数以及import引入的内容,即可在<template/>使用,并且不需要写export default{}

    <script setup>语法糖里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行

      <script>
      console.log(&#39;script&#39;);//多次实例组件,只触发一次
      export default {
          setup() {
              console.log(&#39;setupFn&#39;);//每次实例化组件都触发和script-setup标签一样
          }
      }
      </script>
    Nach dem Login kopieren

    (script-setup标签最终都会编译成setup() 函数的内容,每次实例化组件,就是实例化一次setup函数。script标签里面的setup函数也是一样每次实例化组件,就是实例化一次setup函数,但是script标签setup是需要写在export default{}内的,外的只是首次引入的时候执行一次)

    2、<script setup>引入组件将自动注册

    不需要在引入组件后,通过 components:{}注册组件,可直接使用

    &lt;script setup&gt;
    import MyComponent from &#39;./MyComponent.vue&#39;
    //components:{MyComponent}  不需要注册直接使用
    &lt;/script&gt;
    
    &lt;template&gt;
      &lt;MyComponent /&gt;
    &lt;/template&gt;
    Nach dem Login kopieren

    3、组件通信:

    <script setup>中必须使用 defineProps defineEmits API 来替代 props 和 emits

    definePropsdefineEmits具备完整的类型推断并且在 <script setup> 中是直接可用的(浏览了一下掘金,发现大部分文章demo还是通过import引入这2个api,这点官方文档写得很清楚)

    defineProps 代替props

    接收父组件传递的数据(父组件向子组件传参)

    父组件:

    <template>
      <div>父组件</div>
      <Child :title="msg" />
    </template>
    
    <script setup>
    import {ref} from &#39;vue&#39;
    import Child from &#39;./child.vue&#39;
    const msg = ref(&#39;父的值&#39;)  //自动返回,在template直接解套使用
    </script>
    Nach dem Login kopieren

    子组件:

    <template/> 中可以直接使用父组件传递的props (可省略props.)

    <script-setup> 需要通过props.xx获取父组件传递过来的props

    <template>
      <div>子组件</div>
      <div>父组件传递的值:{{title}}</div>
    </template>
    
    <script setup>
    //import {defineProps} from &#39;vue&#39;   不需要引入
    
    //语法糖必须使用defineProps替代props
    const  props = defineProps({
      title: {
        type: String
      }
    });
    //script-setup 需要通过props.xx获取父组件传递过来的props
    console.log(props.title) //父的值
    </script>
    Nach dem Login kopieren
    defineEmit 代替emit

    子组件向父组件传递数据(子组件向外暴露数据)

    子组件代码:

    <template>
      <div>子组件</div>
      <button @click="toEmits">子组件向外暴露数据</button>
    </template>
    
    <script setup>
    import {ref} from &#39;vue&#39;
    const name = ref(&#39;我是子组件&#39;)
    //1、暴露内部数据
    const  emits = defineEmits([&#39;childFn&#39;]);
    
    const  toEmits = () => {
      //2、触发父组件中暴露的childFn方法并携带数据
      emits(&#39;childFn&#39;,name)
    }
    </script>
    Nach dem Login kopieren

    父组件代码:

    <template>
      <div>父组件</div>
      <Child  @childFn=&#39;childFn&#39; />
      <p>接收子组件传递的数据{{childData}} </p>
    </template>
    
    <script setup>
    import {ref} from &#39;vue&#39;
    import Child from &#39;./child.vue&#39;
        
    const childData = ref(null)    
    const childFn=(e)=>{
        consloe.log(&#39;子组件触发了父组件childFn,并传递了参数e&#39;)
        childData=e.value
    }    
           
    </script>
    Nach dem Login kopieren

    4.<script setup>需主动向父组件暴露子组件属性 :defineExpose

    使用 <script setup> 的组件,父组件是无法通过ref 或者 $parent 获取到子组件的ref等响应数据,需要通过defineExpose 主动暴露

    子组件代码:

    <script setup>
    import { ref } from &#39;vue&#39;
    
    const a = 1
    const b = ref(2)
    //主动暴露组件属性
    defineExpose({
      a,
      b
    })
    </script>
    Nach dem Login kopieren

    父组件代码:

    <template>
      <div>父组件</div>
      <Child  ref=&#39;childRef&#39; />
      <button @click=&#39;getChildData&#39;>通过ref获取子组件的属性 </button>
    </template>
    
    <script setup>
    import {ref} from &#39;vue&#39;
    import Child from &#39;./child.vue&#39;
    const childRef= ref()  //注册响应数据  
    const getChildData =()=>{
      //子组件接收暴露出来得值
      console.log(childRef.value.a) //1
      console.log(childRef.value.b) //2  响应式数据
    }    
    </script>
    Nach dem Login kopieren

    5.语法糖其他功能

    useSlotsuseAttrs少用,由于大部分人是SFC模式开发,在<template/>通过<slot/>标签就可以渲染插槽)

    如果需要在script-setup中使用 slotsattrs 需要用useSlotsuseAttrs替代

    需要引入:import { useSlots ,useAttrs } form 'vue'

    <template/>中通过 $slots$attrs 来访问更方便(attrs用来获取父组件中非props的传递到子组件的参数/方法,attrs 用来获取父组件中非props的传递到子组件的参数/方法,attrs用来获取父组件中非props的传递到子组件的参数/方法,slots可以获取父组件中插槽传递的虚拟dom对象,在SFC模式应该用处不大,在JSX /TSX使用比较多)

    父组件:

    <template>
      <Child msg="非porps传值子组件用attrs接收" >
        <!-- 匿名插槽 -->
        <span >默认插槽</span>
        <!-- 具名插槽 -->
        <template #title>
          <h2>具名插槽</h2>
        </template>
        <!-- 作用域插槽 -->
        <template #footer="{ scope }">
          <footer>作用域插槽——姓名:{{ scope.name }},年龄{{ scope.age }}</footer>
        </template>
      </Child>
    </template>
    
    <script setup>
    // 引入子组件
    import Child from &#39;./child.vue&#39;
    </script>
    Nach dem Login kopieren

    子组件:

    <template>
      <!-- 匿名插槽 -->
      <slot />
      <!-- 具名插槽 -->
      <slot name="title" />
      <!-- 作用域插槽 -->
      <slot name="footer" :scope="state" />
      <!-- $attrs 用来获取父组件中非props的传递到子组件的参数 -->
      <p>{{ attrs.msg == $attrs.msg }}</p>
      <!--true  没想到有啥作用... -->
      <p>{{ slots == $slots }}</p>
    </template>
    
      
    <script setup>
    import { useSlots, useAttrs, reactive, toRef } from &#39;vue&#39;
    const state = reactive({
      name: &#39;张三&#39;,
      age: &#39;18&#39;
    })
    
    const slots = useSlots()
    console.log(slots.default()); //获取到默认插槽的虚拟dom对象
    console.log(slots.title());   //获取到具名title插槽的虚拟dom对象
    // console.log(slots.footer()); //报错  不知道为啥有插槽作用域的无法获取
    //useAttrs() 用来获取父组件传递的过来的属性数据的(也就是非 props 的属性值)。
    const attrs = useAttrs()
    </script>
    Nach dem Login kopieren

    useSlots或许在JSX/TSX下更实用

    想使用JSX语法在vite需要下载相关jsx的plugins才能识别jsx

    useSlots 可以获取父组件传递过来插槽的虚拟dom对象,可以用来渲染插槽内容

    <script lang=&#39;jsx&#39;>
    import { defineComponent, useSlots } from "vue";
    export default defineComponent({
      setup() {
        // 获取插槽数据
        const slots = useSlots();
        // 渲染组件
        return () => (
          <div>
            {slots.default?slots.default():&#39;&#39;}
            {slots.title?slots.title():&#39;&#39;}
          </div>
        );
      },
    });
    </script>
    Nach dem Login kopieren

    大部分人是SFC模式开发,在<template/>通过<slot/>标签就可以渲染插槽,这种JSX 的写法应该是很少人会使用的

    6.在setup访问路由

    • 访问路由实例组件信息:route和router

    setup 里不能访问 this,不能再直接访问 this.$routerthis.$route。(getCurrentInstance可以替代this但不推荐)

    推荐:使用useRoute 函数和useRouter函数替代this.$routethis.$router

    <script setup>
    import { useRouter, useRoute } from &#39;vue-router&#39;
        const route = useRoute()
        const router = useRouter()
        
        function pushWithQuery(query) {
          router.push({
            name: &#39;search&#39;,
            query: {
              ...route.query,
            },
          })
        }
      <script/>
    Nach dem Login kopieren
    • 导航守卫

    仍然可以使用路由实例组件的导航守卫

    import router from &#39;./router&#39;
    router.beforeEach((to,from,next)=&gt;{
    
    })
    Nach dem Login kopieren

    也可以使用组合式api的导航守卫onBeforeRouteLeave, onBeforeRouteUpdate

    <script setup>
    import { onBeforeRouteLeave, onBeforeRouteUpdate } from &#39;vue-router&#39;
    
        // 与 beforeRouteLeave 相同,无法访问 `this`
        onBeforeRouteLeave((to, from) => {
          const answer = window.confirm(
            &#39;Do you really want to leave? you have unsaved changes!&#39;
          )
          // 取消导航并停留在同一页面上
          if (!answer) return false
        })
    
        const userData = ref()
    
        // 与 beforeRouteUpdate 相同,无法访问 `this`
        onBeforeRouteUpdate(async (to, from) => {
          //仅当 id 更改时才获取用户,例如仅 query 或 hash 值已更改
          if (to.params.id !== from.params.id) {
            userData.value = await fetchUser(to.params.id)
          }
        })
     <script/>
    Nach dem Login kopieren

    组合式 API 守卫也可以用在任何由 `` 渲染的组件中,它们不必像组件内守卫那样直接用在路由组件上。

    Das obige ist der detaillierte Inhalt vonWie verwendet Vue3 den Setup-Syntaxzucker, um das Schreiben von Return zu verweigern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    vue3+vite: So beheben Sie den Fehler bei der Verwendung von require zum dynamischen Importieren von Bildern in src vue3+vite: So beheben Sie den Fehler bei der Verwendung von require zum dynamischen Importieren von Bildern in src May 21, 2023 pm 03:16 PM

    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

    So verwenden Sie tinymce im Vue3-Projekt So verwenden Sie tinymce im Vue3-Projekt May 19, 2023 pm 08:40 PM

    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

    Wie Vue3 Markdown analysiert und Code-Hervorhebung implementiert Wie Vue3 Markdown analysiert und Code-Hervorhebung implementiert May 20, 2023 pm 04:16 PM

    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

    So aktualisieren Sie einen Teilinhalt der Seite in Vue3 So aktualisieren Sie einen Teilinhalt der Seite in Vue3 May 26, 2023 pm 05:31 PM

    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

    Detaillierte Erläuterung der Verwendung von Return in der C-Sprache Detaillierte Erläuterung der Verwendung von Return in der C-Sprache Oct 07, 2023 am 10:58 AM

    Die Verwendung von return in der C-Sprache ist: 1. Für Funktionen, deren Rückgabewerttyp ungültig ist, können Sie die Rückgabeanweisung verwenden, um die Ausführung der Funktion vorzeitig zu beenden. 2. Für Funktionen, deren Rückgabewerttyp nicht ungültig ist, ist die Funktion von Die Return-Anweisung dient dazu, die Ausführung der Funktion zu beenden. 3. Beenden Sie die Ausführung der Funktion vorzeitig wenn die Funktion keinen Wert zurückgibt.

    So verwenden Sie wiederverwendbare Vue3-Komponenten So verwenden Sie wiederverwendbare Vue3-Komponenten May 20, 2023 pm 07:25 PM

    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(

    So wählen Sie einen Avatar aus und schneiden ihn in Vue3 zu So wählen Sie einen Avatar aus und schneiden ihn in Vue3 zu May 29, 2023 am 10:22 AM

    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&

    So verwenden Sie vue3+ts+axios+pinia, um eine sinnlose Aktualisierung zu erreichen So verwenden Sie vue3+ts+axios+pinia, um eine sinnlose Aktualisierung zu erreichen May 25, 2023 pm 03:37 PM

    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

    See all articles