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 语法糖用了才知道有多爽 (三)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值