vue3 项目实践总结

news2024/10/2 6:35:36

一、挂载全局变量

1.1 main.js 中挂载

// 引入全局变量
import api from '@/api';

const app = createApp(App);

// 挂载全局变量
app.config.globalProperties.$API = api;

app.use(store)
  .use(router)
  .use(ElementPlus)
  .use(Vant)
  .mount('#app');

1.2 组件中获取

  • 方法一 推荐使用proxy
    1. 使用 ctx ,经过测试后,打包到dist以后,ctx下面的值是拿不到的,即只能在开发环境使用。所以。推荐使用proxy

    2. proxy, ctx可直接访问全局变量,但无法像globalProperties这样查看有哪些数据,只是一个Proxy对象。

    3. 如果想要通过 proxy, ctx 访问当前组件的变量,需要在onBeforeMount 和 mounted生命周期中,即在组件挂载之后才可访问,否则访问不了;

    4. 注意:在vue3中,created相关的生命周期已经被废弃,由setup()代替

import { getCurrentInstance, onMounted } from 'vue';   // 需要调用vue3内置的方法
setup(props, context) {
    // 直接解构出 proxy 和 ctx
    const { proxy, ctx } = getCurrentInstance();
    
	// 使用方法1 : 如果想要通过 proxy, ctx 访问当前组件的变量,需要在onBeforeMount 和 mounted生命周期中    
    onMounted(() => {
      console.log('----ctx', ctx['当前组件的data变量']);
      console.log('----proxy', proxy['当前组件的data变量']);
    });
    
  	// 使用方法2 :直接调用全局变量,但此时无法访问当前组件的变量
    proxy.$API.xxx   // 调用具体的方法
}

在这里插入图片描述在这里插入图片描述

  • 方法二 麻烦但详细
import { getCurrentInstance } from 'vue';   // 需要调用vue3内置的方法
setup(props, context) {
    // 这样获取可以获取到所有的全局变量,包含UI组件库获取其他方法注入的。并且可以想象的查看有哪些数据
    const { appContext: { config: { globalProperties } } } = getCurrentInstance();
    globalProperties.$API.xxx   // 调用具体的方法
}

在这里插入图片描述

1.3 全局挂载 store 和 router

在第九章中阐述了怎么在页面中去使用storerouter,但在实际项目开发中,storerouter 的使用频率是很高的,每个组件(页面)都去这么引入/调用,会显得很麻烦。

1. 挂载到window上

但是你要忍受它的全局污染

2. 挂载到全局上

在我的实际开发中,总会有几个东西会挂载到全局变量上:比如 ajax 或者APImoment等,再将 storerouter 挂载上去,使用成本对于我来说并没有增加多少。

  • main.js
const app = createApp(App);

// 将store、router挂载到全局变量上
import { useStore } from "vuex";
import { useRoute } from "vue-router";
app.config.globalProperties.$store = useStore();
app.config.globalProperties.$router = useRoute();

app.use(router).use(store).mount('#app')
  • 组件(页面)中
<template>
    <span> {{ count }} </span>
	
	<!-- 
    	下面这种vue2的旧写法,依旧可用,但是可能编辑器会报警告;
		并且$store并不需要在组件中return处理,它是挂载到每个实例上的
    -->
	<span>{{ $store.state.count }}</span>
</template>
<script>
    import { getCurrentInstance, computed, ref } from 'vue';
    export default {
      name: 'Home',
      setup() {
        const { proxy } = getCurrentInstance();
        // 使用store
        const count = computed(() => proxy.$store.state.count);

        const handleSkip = () => {
          // 使用router
          proxy.$router.push('/about');
        }

        return {
          count: ref(count),
          handleSkip
        }
      }
    }
</script>
3. 使用Provide & Inject => 不推荐,使用成本较高

注意:使用 Provide & Inject 最好配置 readonly 或者 shallowRef ,限制 孙子组件修改一级组件的数据。避免造成数据混乱。

  • app.vue
<script setup>
import { useStore } from "vuex";
import { useRoute } from "vue-router";

import { provide } from "vue";

// 组合式的API provide 没有提供批量方法,只能每个变量写一句
provide("store", useStore());
provide("router", useRoute());
</script>
  • 组件(页面)中
<script setup>
import { inject } from "vue";

// 使用 inject 获取到 store 和 router
const store = inject("store");
const router = inject("router");

console.log('=====>>>>', store.state);
console.log('=====>>>>', router);
</script>

注意 : inject()只能放在setup()生命周期里运行,即不能放在别的周期里运行,也不能放在事件周期里运行。

个人理解:只能在同步代码中使用,不能再异步代码中使用,所以,一般先在setup()周期中取值。

放在 setTimeout 或者 Promise.then() 是不可以的,但是下面这种用法是可以的:

function xx() {
  console.log(inject("abc"))
}
xx()

二、封装 getCurrentInstance

在上一章的 挂载全局变量 中有提到:想要获取全局变量,一般都是从getCurrentInstance() 解构出 proxyglobalProperties,但是:

  • 解构出的 proxy ,包含所有的全局变量,但是 是Proxy对象,不能清楚的在控制台查看
  • globalProperties 里面全部的全局变量,并且不是Proxy对象,可以在控制台清楚查看

而每个组件里面都去解构一次 globalProperties 是很繁琐的,所以,我们可以封装一下,实现步骤如下:

  1. 新建文件 hooks / useCurrentInstance.ts
import { ComponentInternalInstance, getCurrentInstance } from 'vue'
export default function useCurrentInstance() {
  // 如果解构出 proxy ,里面也包含所有的全局变量,但是 是Proxy对象,不能清楚的在控制台查看
  const { appContext } = getCurrentInstance() as ComponentInternalInstance;
  // 这里有全部的全局变量,并且不是Proxy对象,可以在控制台清楚查看
  const globalProperties = appContext.config.globalProperties;
  return {
    globalProperties
  }
}
  1. 组件中使用
// 先引入
import useCurrentInstance from '@/hooks/useCurrentInstance';

// 再使用
export default {
    setup() {
        const { globalProperties } = useCurrentInstance();
        // 这里面的全局变量可以清楚的在控制台去查看
    	console.log('-------globalProperties', globalProperties)
    }
}

注意 :不能再封装文件里面直接调用函数并直接导出全局变量,会报错!!

三、vue3中使用ref

// ------------ 官网实例 ------------
<template> 
  <div ref="root">This is a root element</div>
</template>

<script>
  // 引入ref API
  import { ref, onMounted } from 'vue'

  export default {
    setup() {
      const root = ref(null)

      onMounted(() => {
        // DOM 元素将在初始渲染后分配给 ref
        console.log(root.value) // <div>This is a root element</div>
      })

      return {
        root   // 暴露出来的变量名必须和template 里面ref的值相同
      }
    }
  }
</script>



// ------------ 实际使用 ------------
<template>
    // publish 是一个子组件
	<publish ref="pubRef"></publish>

    <div @click="handleAddPublish">点击</div>
</template>

<script lang="ts">
  // 引入ref API
  import { ref } from 'vue'

  export default {
    setup() {
      	const root = ref(); // 如果是在 ts 环境下,不能传入null作为参数,否则root.value将提示结果为null, 不能调用子组件的方法;在js环境可以传null
        const handleAddPublish = () => {
          root.value.init();  // init 是子组件return出来的一个方法
        };

        return {
            handleAddPublish,
            pubRef: root   // 暴露出来的变量名必须和template 里面ref的值相同
        }
    }
  }
</script>

四、vue3中的nextTick

// nextTick: 将回调推迟到下一个DOM更新周期之后执行,在更改了一些数据以等待DOM更新后立即使用它。

import { nextTick } from 'vue'
setup() {
    const changeMessage = newMessage => {
        nextTick(()=>{
            // to do list...
        })
    };

    return {
		changeMessage         
    }
}

五、详解单文件组件<script setup>

<script setup> 是在单文件组件(SFC)中使用组合式 API 的编译时语法糖。相比于普通的 <script> 语法,它具有更多优势。详情请阅读官方文档

  1. 基本语法
// 将 setup 属性添加到 script 标签上即可
<script setup>
	console.log('hello script setup')
</script>

setup里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行并且自带 return 功能,所有在里面声明的变量、函数都能在模板中直接使用!

  1. 使用 props、emit、useContext

    vue3中如果想要获取 props、emit、attr等参数,需要从setup(props, context) 的参数里面获取,但<script setup> 省略了这一步,所以获取方式也需要修改:

   <template>
     <p>{{type[0]}}</p>
     <button @click="emit('setData', Number.parseInt(Math.random() * 10))">添加数据</button>
   </template>
   
   <script setup>
       import { defineEmit, defineProps } from 'vue' // 这两个方法其实无需导入,他们是<script setup>里的编译器宏,会自动编译
       // 获取props => 注意:props不能结构,会失去响应式效果
       const props = defineProps({
         list: {
           type: Array,
           default: () => []
         }
       })
       
    	// 获取emit   
       const emit = defineEmit(['deleteData', 'setData'])
       
       // 获取slots、attrs 等其他组件
       const { slots , attrs } = useContext()
   </script>
  1. 自动注册指令与组件
<template>
  <!-- 使用指令 -->
  <div v-click-outside />

  <!-- 使用组件 -->
  <MyComponent />
</template>

<script setup>
  // 指令导入后即可直接使用, 无需注册
  import { directive as clickOutside } from 'v-click-outside';
    
  // 组件导入后也可直接使用, 无需注册
  import MyComponent from './MyComponent.vue'
</script>

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



文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研发工程师玩转Kubernetes——非定时任务

在《研发工程师玩转Kubernetes——自动扩缩容》一文中&#xff0c;我们使用在本地使用wrk进行了压力测试。如果我们希望在容器中运行&#xff0c;该怎么做呢&#xff1f; 构建/推送wrk镜像 Dockerfile如下。主要就是在Ubuntu22中安装wrk。 From ubuntu:22.04 RUN apt-get up…

【Nodejs】Node-js笔记

Node.js 文章目录 Node.js一、Node.js概述1.1、介绍1.2、官网1.3、Node.js应用场景1.4、安装Node.js1.5、npm包管理器1.5.1、介绍1.5.2、切换npm源1.5.3、生成JSON配置文件1.5.4、查看当前安装的树形模块1.5.5、安装模块1.5.6、自定义脚本命令1.5.7 、自动重启应用 1.6、模块化…

VehicleHal.java - fwk层对应VehicleService

VehicleHal.java - fwk层对应VehicleService 1、VehicleHal.java初始化1.1 hal服务区分1.2 简要时序图 2、PowerHalService为例2.1 PowerHalService初始化和订阅2.2 简要时序图 android12-release 【IVI】VehicleService启动 【IVI】车载设备硬件抽象层VHAL 【IVI】CarService启…

【人脸识别】insightface 使用记录和搭建服务注意点和坑 从0到1

文章目录 前言1.开始1.1 前置1.2 再次运行&#xff0c;人脸检测跑通1.3 人脸特征抽取1.3.1 模型下载1.3.2 重新跑一下检测和识别1.3.3 人脸监测返回值分析1.3.4 计算相似度 1.4 全流程的相似度 2. 业务化人脸识别 前言 人脸识别项目&#xff0c;再走一遍。之前是公司老人留下的…

HTML+CSS实训——Day05——JavaScript基础知识点

前言 上一周我们只做了静态页面&#xff0c;这周开始要学js了&#xff0c;那我们先来认识一下他的语法和变量吧。 知识点 变量定义 学习了var还有console.log()输出变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&…

点云配准算法综述-完整解读

点云配准的挑战 同源点云配准 同源点云的配准是指从同一类型的传感器,但在不同的时间或视角下获取的点云在进行配准问题中存在的挑战,其主要包含了 噪声和离群值。在不同的采集时间,环境和传感器噪声是不同的,采集到的点云在同一三维位置附近会包含噪声和异常值。部分重叠…

全网最火爆,从接口测试到接口自动化测试总结,卷王进阶高级...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python接口自动化测…

设计模式之美-为什么基于接口而非实现编程?有必要为每个类都定义接口吗?

我愿意称之为最强设计书籍之一。看完这篇文章使我对代码编写有了新的思考。值得注意的是文章全篇写的是伪代码&#xff0c;并没有真正实现方法的逻辑&#xff0c;不过这样反而有利于逻辑的理解。 在上一节课中&#xff0c;我们讲了接口和抽象类&#xff0c;以及各种编程语言是如…

如何跑通一个java项目

查找项目代码的途径&#xff1a;github,码云&#xff0c;掘金网 以小说精品屋项目(掘金网)为例&#xff1a; 先读Readme&#xff08;这里会介绍项目结构和技术选型&#xff09;&#xff0c;这里还会告诉你们怎么跑起来这个项目&#xff0c;比如让你先安装数据库&#xff0c;然…

从业者指南:专业编辑和校对技巧

在写作领域&#xff0c;编辑和校对是确保高质量作品的关键步骤。作为从业者&#xff0c;你需要掌握专业的编辑和校对技巧&#xff0c;以提高客户满意度和自己的市场竞争力。以下是一些值得关注的专业编辑和校对技巧。 1.建立良好的沟通 与客户保持良好的沟通是提高编辑和校对质…

如何更改 Linux 文件和目录权限?

在Linux系统中&#xff0c;文件和目录权限是安全性和访问控制的关键组成部分。正确设置文件和目录的权限可以确保只有授权的用户能够读取、写入或执行这些文件和目录。 本文将详细介绍如何在Linux系统中更改文件和目录的权限。 1. 文件和目录权限概述 在Linux系统中&#xff…

解决Kubernetes就绪检查导致网关不可用的问题

引言 在K8s环境中&#xff0c;由于就绪检查设置不合理的问题&#xff0c;导致出现网关不可用的情况。 本文将详细探讨这个问题的原因&#xff0c;并提供一些解决方案&#xff0c;帮助有需要的同学解决类似的问题。 注&#xff1a;网关使用 spring-cloud-gateway 问题描述 描…

记录两个Windows和Mac上部署阿里Canal无法启动的神坑

目录 一、问题列表 二、解决方案 三、参考资料 四、配置详解 五、数据库相关操作 一、问题列表 1、问题一&#xff1a;点击 startup.bat 窗口出现后立马闪退的问题。 2、问题二&#xff1a;启动后日志文件报错&#xff1a; ERROR com.alibaba.otter.canal.deployer.Cana…

办公OA系统性能分析案例

前言 信息中心老师反应&#xff0c;用户反馈办公系统有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量&am…

多项创新技术加持,实现零COGS的Microsoft Editor语法检查器

编者按&#xff1a;Microsoft Editor 是一款人工智能写作辅助工具&#xff0c;其中的语法检查器&#xff08;grammar checker&#xff09;功能不仅可以帮助不同水平、领域的用户在写作过程中检查语法错误&#xff0c;还可以对错误进行解释并给出正确的修改建议。神经语法检查器…

自动化测试框架的秘密,资深8年测试带你揭开,跟上测试“潮流“...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

携手共创开源新格局|2023开放原子全球开源峰会将于6月11日在京隆重开幕

6月11-13日&#xff0c;2023开放原子全球开源峰会将在全球数字经济大会期间召开。本次峰会将以“开源赋能&#xff0c;普惠未来”为主题&#xff0c;通过开幕式暨高峰论坛、分论坛、主题展览、开源活动周等多种形式&#xff0c;聚集政、产、学、研、用、创、投、金等各领域优势…

RPC学习笔记【一】:概述

文章目录 一、简介1.1 引言1.2 架构的演变过程 二、RPC 的设计2.1 设计目标2.2 核心问题01 通信方式02 协议03 序列化04 远程代理类 2.3 衍生方案 - 注册中心 一、简介 1.1 引言 RPC 是远程过程调用 &#xff08;Remote Procedure Call&#xff09;的缩写形式&#xff0c;是一…

一文搞懂Python时间序列预测(步骤,模板,python代码)

预测包括&#xff0c;数值拟合&#xff0c;线性回归&#xff0c;多元回归&#xff0c;时间序列&#xff0c;神经网络等等 对于单变量的时间序列预测&#xff1a;模型有AR,MA,ARMA,ARIMA&#xff0c;综合来说用ARIMA即可表示全部。 数据和代码链接&#xff1a;数据和Jupyter文…

ArcGIS10.8下载及安装教程(附安装步骤)

谷歌云&#xff1a; https://drive.google.com/drive/folders/10igu7ZSMaR0v0WD7-2W-7ADJGMUFc2ze?uspsharing ArcGIS10.8 百度网盘&#xff1a; https://pan.baidu.com/s/1s5bL3QsCP5sgcftCPxc88w 提取码&#xff1a;kw4j 阿里云&#xff1a; https://www.aliyundriv…