vue3 script setup 语法糖用了才知道有多爽 (四)


这里是完整的目录图片,由于整篇文章篇幅太长,拆分成了几篇来展示
在这里插入图片描述

6. 与普通的 <script> 一起使用

<script setup> 组件是可以和普通的 <script>标签混合在一起使用的
当需要使用 有一些只能在 <script> 中进行,而不能在 <script setup> 中进行的操作 这时候就可以混合使用<script setup> <script>标签

<script>
// 普通 <script>, 在模块作用域下执行 (仅一次)
runSideEffectOnce()

// 声明额外的选项
export default {
    
    
  inheritAttrs: false,
  customOptions: {
    
    }
}
</script>

<script setup>
// 在 setup() 作用域中执行 (对每个实例皆如此)
</script>

可能会遇到的情况

  • 只能在 <script> 标签中声明 , 无法在 <script setup> 中声明的选项的
    • 例如 : inheritAttrs
    • 通过插件弃用的自定义选项
  • 声明命名导出
    • 给组件起名字,就需要按照原本的方式导出
    • 当我们需要保证导入的总是引用,就需要注意尽量使用命名引入以及命名导出
  • 运行某些只需要执行一次的操作或者只需要执行一次的对象

定义组件的name
Vue 3 setup() 语法

<script>
 export default {
    
    
 	name: 'child',
     setup() {
    
    
       return {
    
    };
     },
 };
</script>

<script setup> 语法糖的写法
name 还是需要用单独的 <script> 来定义

 <script> export default {
    
     name: 'child' } </script>
 <script setup>
 
 </script>

从语法角度来讲,是可以混合使用,并没用强制限制所有在 <scirpt setup> 中声明的内容不能在 script 标签中声明
但是从使用规范的角度来讲,除了以上的这些情况,尽量避免已经可以用 <script setup> 定义的选项单独使用 <script>
如 : props , emit … (这样子写不报错,但是不规范)
当使用 option API 的时候,是无法访问到 在 <script setup> 当中创建的变量的,官方强烈反对以这种方式混合 API
注意 : 当混合使用 <script setup><script> 的时候,语言类型需要一致,否则会报错
在这里插入图片描述
在这里插入图片描述

如果发现业务逻辑处于不被支持的场景中,可以考虑切换为 setup () 的函数,而不是一定要使用 <script setup>

7. 路由useRoute和useRouter的使用

useRoute和useRouter

<script setup> 当中是不能访问 this 的,所以不能直接访问 this.$router 或者 #route ,可以用 getCurrentInstance 来代替 this , 通过 getCurrentInstance 方法获取当前组件实例,从而获取 route 和 router

这里展示我自己项目中用到的不同写法
Vue 3 setup() 语法 一

<script  lang="ts">
  import {
    
     defineComponent, getCurrentInstance } from 'vue';
  export default defineComponent({
    
    
    setup() {
    
    
      let {
    
     proxy } = getCurrentInstance()
      console.log(proxy?.$route)
      console.log(proxy?.$router)
      return {
    
    };
    },
  });
</script>

在这里插入图片描述

Vue 3 setup() 语法 二

<script  lang="ts">
  import {
    
     defineComponent } from 'vue';
  import {
    
     router } from '/@/router';
  export default defineComponent({
    
    
    setup() {
    
    
      console.log(router.currentRoute); // 打印的内容如下
      console.log(router.currentRoute.value);
      return {
    
    };
    },
  });
</script>

在这里插入图片描述

<script setup> 语法糖的写法
通过从路由中导入 useRoute useRouter 使用 route 和 router。

  import {
    
     useRoute } from 'vue-router'  //  这里直接从 vue-router 中引入
   const route = useRoute();
   console.log(route)
   console.log(JSON.parse(JSON.stringify(route)))  // 这里是个 proxy 对象,所以我们用  JSON.parse(JSON.stringify(route))  将数据解析出来

在这里插入图片描述
可以看到两种写法都是可以获取到的 route 对象的

路由导航守卫

Vue 3 setup() 语法

<script>
import {
    
     defineComponent } from 'vue'
export default defineComponent({
    
    
  setup () {
    
     /* */ },
  beforeRouteEnter (to, from, next) {
    
     // 组件导航守卫---前置守卫
    console.log(to)
    console.log(from)
    next()
  },
  beforeRouteLeave (to, from) {
    
     // 组件导航守卫---后置守卫
    console.log(to)
    console.log(from)
  }
})
</script>

<script setup> 语法糖的写法

<script setup>
import {
    
     onBeforeRouteLeave, onBeforeRouteUpdate } from "vue-router";

// 添加一个导航守卫,在当前组件将要离开时触发。
onBeforeRouteLeave((to, from, next) => {
    
    
  next();
});

// 添加一个导航守卫,在当前组件更新时触发。
// 在当前路由改变,但是该组件被复用时调用。
onBeforeRouteUpdate((to, from, next) => {
    
    
  next();
});
</script>

vue3 script setup 语法糖用了才知道有多爽 (一)
vue3 script setup 语法糖用了才知道有多爽 (二)
vue3 script setup 语法糖用了才知道有多爽 (三)

猜你喜欢

转载自blog.csdn.net/YZRHANYU/article/details/129618060