Vue 响应式监听 Watch 最佳实践

news2024/11/16 13:51:29

image.png

一. 前言

上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章:

详解 Vue 中 Watch 的使用方法及注意事项icon-default.png?t=O83Ahttps://blog.csdn.net/qq_24956515/article/details/142452530

通过了解,我们知道了 watch 是 Vue 中的是一个强大的功能,可以让我们监听数据的变化并在变化发生时执行相应的操作。在开发 Vue 应用过程中,watch可以帮助我们处理许多实际的应用场景,并实现最佳实践。

在本文中,我们将会深入探讨watch的实际使用场景,并总结最佳实践,以下的场景都是我在实际项目中能够总结的经常使用的,包括但不限于以下内容:

  1. 表单验证:用来监听表单输入框的变化,并对输入的内容进行验证。

  2. 异步操作:用于监听数据的变化,并触发相应的异步操作,比如网络请求等。

  3. 联动操作:监听数据的变化,并在变化时执行相应的联动操作。

  4. 计算属性与watch的结合使用:比较watch和计算属性的区别,以及它们在不同场景下的应用和最佳实践。

  5. 同步多个watch:处理多个watch同时触发的情况,并提供一些同步多个watch的最佳实践建议。

  6. 监听路由参数:使用watch来监听 Vue 路由参数的变化,并根据参数的变化来更新组件的状态或执行相应的操作。

通过详细了解实际使用场景和最佳实践,可以帮助我们更好地理解和运用 Vue 的watch功能,从而提高 Vue 应用的编码灵活性。

二. watch 的实际应用场景

1. 表单验证

Vue 的watch选项在表单验证中有广泛的应用。通过监听表单字段的变化,可以实时检查用户的输入并进行验证。下面是一个简单的示例,展示了如何使用watch实现表单验证:

<template>
  <div>
    <input v-model="username" placeholder="请输入用户名" />
    <p v-if="usernameError" class="error">用户名不能为空</p>

    <input v-model="password" type="password" placeholder="请输入密码" />
    <p v-if="passwordError" class="error">密码不能为空</p>

    <button @click="submitForm" :disabled="isInvalid">提交</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: "",
      password: "",
      usernameError: false,
      passwordError: false,
    };
  },
  watch: {
    username(value) {
      this.validateUsername(value);
    },
    password(value) {
      this.validatePassword(value);
    },
  },
  methods: {
    validateUsername(username) {
      this.usernameError = username.length === 0;
    },
    validatePassword(password) {
      this.passwordError = password.length === 0;
    },
    submitForm() {
      if (!this.isInvalid) {
        // 验证通过,提交表单
        // ...
      }
    },
  },
  computed: {
    isInvalid() {
      return this.usernameError || this.passwordError;
    },
  },
};
</script>

<style>
.error {
  color: red;
}
</style>

在上述示例中,我们使用了两个watch来监听usernamepassword字段的变化。当用户输入用户名时,会触发username字段的watch回调函数,并调用validateUsername方法进行验证。同理,当用户输入密码时,会触发password字段的watch回调函数,并调用validatePassword方法进行验证。通过设置usernameErrorpasswordError变量来控制错误提示的显示。

submitForm方法中,我们通过isInvalid计算属性来判断表单是否通过验证。只有当isInvalid的值为false时,才允许提交表单。

这样,每当用户输入用户名或密码时,watch会自动调用相应的验证方法,实时检查用户的输入。当用户名或密码为空时,会显示相应的错误提示,如果表单通过了验证,提交按钮就可以点击。

这个示例只是表单验证中的一种简单情况,实际应用中可能会涉及更复杂的验证逻辑。通过使用watch选项,我们可以根据具体需求来构建强大的表单验证功能。

2. 异步操作

Vue 的watch属性可以用于监听数据的变化,并触发相应的异步操作。以下是一个简单的 Vue 异步操作的代码示例:

<template>
  <div>
    <input v-model="inputValue" placeholder="请输入内容" />
    <div v-if="loading">加载中...</div>
    <div v-else>{{ result }}</div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        inputValue: "",
        loading: false,
        result: "",
      };
    },
    watch: {
      inputValue(newInputValue) {
        this.loading = true;

        // 模拟异步操作,比如发送请求
        setTimeout(() => {
          // 异步操作完成后更新数据
          this.loading = false;
          this.result = this.processData(newInputValue);
        }, 2000);
      },
    },
    methods: {
      processData(input) {
        // 这里可以进行对输入数据的处理
        return "处理后的结果: " + input;
      },
    },
  };
</script>

在上述代码示例中,我们使用v-model指令将输入框的值与 Vue 实例的inputValue属性进行绑定。然后,通过watch属性监听inputValue的变化,并在变化时触发异步操作。

watch的回调函数中,我们首先将loading设置为true以显示加载中的提示信息。然后,我们模拟了一个异步操作,比如发送请求。在异步操作完成后,我们将loading设置为false,并更新result的值,这个值会根据异步操作的结果而改变。

在这个示例中,我们模拟了一个 2 秒钟的异步操作,处理了输入的数据,并将处理后的结果赋给result。在异步操作进行中,用户会看到"加载中..."的提示信息,当异步操作完成后,会显示处理后的结果。

通过以上的代码示例,我们可以看到 Vue 的watch属性在异步操作中的实际应用。它可以方便我们监听数据的变化,并在变化发生后执行异步操作,从而实现了异步操作的控制与处理。

3. 联动操作

Vue 的watch属性可以用于监听数据的变化,并在变化时执行相应的联动操作。以下是一个简单的 Vue 联动操作的代码示例:

<template>
  <div>
    <input v-model="inputValue" placeholder="请输入内容" />
    <div>
      <h3>输入内容的长度:</h3>
      <p>{{ inputLength }}</p>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        inputValue: "",
        inputLength: 0,
      };
    },
    watch: {
      inputValue(newInputValue) {
        // 在输入值变化时更新输入内容的长度
        this.inputLength = newInputValue.length;
      },
    },
  };
</script>

在这个代码示例中,我们使用v-model指令将输入框的值与 Vue 实例的inputValue属性进行双向绑定。然后,通过watch属性监听inputValue的变化,在变化时更新inputLength的值。

watch的回调函数中,我们将输入值的新值作为参数(newInputValue)传入,并根据新值的长度更新inputLength的值。

在这个示例中,每当用户在输入框中输入内容时,watch会监听到inputValue的变化,并更新inputLength的值,以反映输入内容的长度。

通过以上的代码示例,我们可以看到 Vue 的watch属性在联动操作中的实际应用。它可以方便地监听数据的变化,并执行相应的操作,用于实现多个数据之间的联动效果。例如,在这个示例中,我们实现了输入内容长度与输入值之间的联动,保持了它们的同步更新。

4. 同步多个监听

在 Vue 中,可以使用watch来监听多个数据的变化并进行相应的处理。这种情况下,我们通常称之为同步多个watch

有一个常见场景是表单联动,当表单中的多个字段之间存在关联关系时,可以使用多个watch来实现表单的联动效果。例如,当选择某个选项时,其他选项的可选项列表会相应改变。

<template>
  <div>
    <select-model="selectedCategory">
      <option value="fruit">水果</option>
      <option value="vegetable">蔬菜</option>
    </select>
    <select v-model="selectedItem">
      <option v-for="item in items" :key="item.id">{{ item.name }}</option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedCategory: null,
      selectedItem: null,
      items: []
    };
  },
  watch: {
    selectedCategory(newCategory) {
      // 根据选定的类别获取对应的选项列表
      this.items = this.fetchItemsByCategory(newCategory);
      // 重置选中的选项
      this.selectedItem = null;
    },
    selectedItem(newItem) {
      // 处理选中的选项
      this.handleSelectedItem(newItem);
    }
  },
  methods: {
    fetchItemsByCategory(category) {
      // 根据类别获取对应的选项列表
      // 在实际项目中,请替换为真正的异步请求
      // 返回选项列表
      return [];
    },
    handleSelectedItem(item) {
      // 处理选中的选项
      // ...
    }
  }
};
</script>

在上述示例中,我们使用了两个watch来监听selectedCategoryselectedItem两个数据的变化。当选择的类别Category改变时,第一个watch会重新获取对应类别的选项列表,并重置selectedItem为 null。而当选中的选项selectedItem改变时,第二个watch会执行相应的逻辑处理。

5. 动态路由的处理

Vue 的watch属性在处理动态路由方面也有实际应用场景。比如:路由发生变化时,watch会监听到$route的变化,并执行相应的操作,主要用于处理新的路由信息。以下是一个简单的 Vue 动态路由处理的代码示例:

<template>
  <div>
    <router-view></router-view>
  </div>
</template>

<script>
  export default {
    watch: {
      $route(newRoute, oldRoute) {
        // 在路由变化时执行相应的操作
        console.log("路由变化:", newRoute, oldRoute);
        // 根据新的路由信息执行其他逻辑
        this.handleRouteChange(newRoute);
      },
    },
    methods: {
      handleRouteChange(route) {
        // 根据路由信息进行处理
        // 此处仅打印新的路由路径作为示例
        console.log("新的路由路径:", route.path);
      },
    },
  };
</script>

在这个代码示例中,我们有一个基本的 Vue 组件,使用了 Vue Router 进行路由管理。我们通过<router-view>标签来渲染当前的路由组件。

通过watch属性,我们可以监听 Vue Router 中的$route对象,它包含了当前路由的信息。在$route对象发生变化时,watch回调函数会被触发。

在这个示例中,我们监听了$route,并在路由变化时执行相应的操作。在回调函数中,我们可以获取到新的路由信息(newRoute)和旧的路由信息(oldRoute),并可以根据路由信息执行其他逻辑。

handleRouteChange方法中,我们根据路由信息进行处理。在这个示例中,我们简单地使用console.log来打印新的路由路径。

每当路由发生变化时,watch会监听到$route的变化,并执行相应的操作,比如处理新的路由信息。

通过以上的代码示例,我们可以看到 Vue 的watch属性在动态路由处理方面的实际应用。它可以方便地监听路由的变化,并执行相应的操作,用于处理动态路由相关的逻辑。

三. watch 的最佳实践

Vue 的watch是一个非常有用的功能,它提供了对 Vue 实例的属性或者表达式的侦听器。这个侦听器会在属性或者表达式的值发生变化时触发相应的回调函数。

以下是一些 Vue 中使用watch的最佳实践:

1. 减少回调函数中的复杂逻辑

回调函数应该尽量简洁,遵循单一责任原则。如果需要处理复杂的逻辑,可以将逻辑拆分为单独的方法,然后在回调函数中调用这些方法。

2. 合理使用深度监听

默认情况下,watch是浅监听的,只能监听到对象的引用变化。如果需要监听对象内部的属性变化,可以通过deep选项进行深度监听。

watch: {
  obj: {
    handler(newVal, oldVal) {
      // 对象内部属性的变化
    },
    deep: true
  }
}

watch选项虽然提供了深度监听的功能,可以跟踪嵌套对象或数组的变化。但在使用深度监听时,需要注意以下几点:

  • 性能问题:深度监听会在对象或数组的每个级别都进行递归遍历,因此在嵌套层级较深、数据量较大的情况下,可能会带来性能问题。

  • 深度监听和计算属性:深度监听和计算属性之间存在一些互相影响的问题。由于深度监听会触发对象或数组的所有变化,可能导致计算属性的计算次数过多,从而影响性能。在使用深度监听时,要特别关注计算属性的计算逻辑,以避免不必要的计算。

  • 对象和数组的变化检测:Vue 的响应式系统可以检测到对象或数组的变化,并触发相应的更新。但对于某些特定情况,如直接使用通过索引直接修改数组元素、直接用下标设置对象属性等,Vue 可能无法检测到变化。

  • 引用类型数据的变化:深度监听只能监听引用类型的变化,无法检测到引用类型数据内部属性的变化。例如,对于对象的属性值的变化,Vue 会自动进行侦测和响应。但如果仅修改了属性值,而未修改整个对象的引用,深度监听将无法触发。

深度监听是一种强大的功能,可以用于监听嵌套对象或数组的变化,但在使用时需要注意性能、计算属性、变化检测和引用类型数据的影响。根据具体的场景和需求,灵活地选择使用深度监听或其他替代方案。

3. 避免循环依赖

watch中的依赖关系是自动解析的,但是要注意避免出现循环依赖的情况。当在 watch 选项中监听属性时,如果在回调函数中修改了被监听的属性,可能会导致循环引用的问题。为了避免这种问题,可以在修改属性前检查新旧值是否相等,或者使用 Vue 的this.$nextTick()来推迟执行。

4. 使用immediate选项

immediate选项可以在组件加载时立即执行回调函数一次。这常用于初始化数据或者处理一些需要立即执行的操作。

watch: {
  foo: {
    handler(newVal, oldVal) {
      // 回调函数
    },
    immediate: true
  }
}

5. 使用 watch 配合 computed

computed属性可以根据数据的变化自动更新计算结果,而watch可以用于监听数据的变化并执行相应的副作用操作。可以结合使用这两个功能来实现更复杂的逻辑。

watch: {
  fullName: {
    handler(newVal, oldVal) {
      // 监听computed属性fullName的变化
    },
    immediate: true
  }
},
computed: {
  fullName() {
    return this.firstName + ' ' + this.lastName;
  }
}

6. 合理使用watch

watch 选项可以用于在数据变化时执行一些复杂的逻辑操作,但过度使用 watch 可能会导致性能问题。在不必要的情况下,可以尝试使用计算属性来替代 watch。只在需要监听特定数据变化时使用 watch

因此,虽然 watch虽然是一个强大的功能,但是在不必要的情况下,应该尽量避免过多的使用。因为每个watch都需要消耗一些性能,当watch过多或者逻辑复杂时,可能会导致性能下降。优先考虑使用computed属性来处理需求。

7. 注意异步更新的情况

在 Vue 中,watch选项默认是同步的,即在侦听到数据变化后立即触发回调函数。但有时候我们需要在watch中进行异步操作,例如发送网络请求或执行定时任务等。下面介两种实现异步更新的方法:

  • 使用nextTick方法:可以在watch回调函数中使用$nextTick方法,将操作放入下一次 DOM 更新循环中执行,从而实现异步更新。

watch: {
  username(newValue) {
    this.$nextTick(() => {
      // 异步操作
      // ...
    });
  }
}

this.$nextTick方法接受一个回调函数作为参数,并在下一次 DOM 更新循环中执行该回调函数。这样就可以将需要异步执行的操作放在回调函数内部。

  • 使用setTimeout方法:可以在watch调函数中使用setTimeout方法来延迟执行代码,实现异步更新。

watch: {
  username(newValue) {
    setTimeout(() => {
      // 异步操作
      // ...
    }, 0);
  }
}

通过将代码放入setTimeout回调函数内部,可以以 0 毫秒的延迟将代码放入事件队列中从而实现异步执行。

注意:使用异步更新会使得代码的执行顺序发生变化,可能会导致一些意想不到的问题。确保在异步操作中正确处理所有依赖关系和数据同步,避免出现竞争条件或数据不一致的情况。

另外,对于复杂的异步操作,推荐使用Promiseasync/await等异步编程的方式,以便更好地管理和处理异步逻辑。

总结:虽然watch默认是同步的,但可以通过$nextTicksetTimeout等方式实现异步更新。根据具体需求选择适合的方式来处理异步操作,确保代码的正确性和可维护性。

综上所述,合理使用 Vue 的 watch 选项可以方便地监听数据变化并执行相应的操作。但需要注意避免过度使用、处理循环引用和使用相应的选项来适应不同的需求。

通过遵循以上的最佳实践,可以更好地应用 Vue 的watch功能,提高代码的可读性、可维护性,同时避免潜在的性能问题。

四. 总结

在本篇文章中,我们详细探讨了 Vue 的watch功能的实际使用场景和最佳实践。了解和熟练运用 watch 可以帮助我们更好地处理数据变化和执行相应的操作,提高 Vue 应用的质量和效率。

在使用watch时,我们应该根据具体的需求和场景进行设计和实践,合理选择选项和处理方式。同时,我们了解到异步处理、与计算属性配合使用以及监听路由参数的方法和技巧。

通过遵循最佳实践,我们可以编写更具可读性、可维护性和性能的代码。在实际开发中,不断学习和掌握 watch 功能的用法,加深对 Vue 的理解,将有助于我们构建出更优雅、高效的 Vue 应用。

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

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

相关文章

53 语言模型(和之后用来训练语言模型的数据集)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录理论部分使用计数来建模N元语法总结 代码读取长序列数据随机采样顺序分区 小结练习 理论部分 在上一部分中&#xff0c;我们了解了如何将文本数据映射为词元&#xff0c;以及将这些词元可以视为一系列离散的观测&#xff0c;例如单词或字符…

(务必收藏)推荐市面上8款AI自动写文献综述的网站

在当前的学术研究和论文写作中&#xff0c;AI技术的应用已经变得越来越普遍。特别是在文献综述这一环节&#xff0c;AI工具能够显著提高效率并减少人工劳动。以下是市面上8款推荐的AI自动写文献综述的网站&#xff1a; 一、千笔-AIPassPaper 是一款备受好评的AI论文写作平台&…

java 框架组件

Java 框架是一系列预先编写好的、可复用的软件组件&#xff0c;它们旨在帮助开发者快速构建高质量的应用程序。Java 社区拥有众多优秀的框架&#xff0c;涵盖了从 Web 开发到大数据处理的各个领域。下面是一些流行的 Java 框架及其主要用途&#xff1a; Spring框架&#xff1a;…

基于丹摩智算部署SD3+ComfyUI文生图详解

目录 丹摩智算简介SD3ComfyUI文生图简介 SD3ComfyUI文生图部署步骤1.1、实例创建 操作步骤从HF-mirror下载SD3模型安装git安装ComfyUI 丹摩智算简介 丹摩智算官网&#xff1a;https://www.damodel.com/home 丹摩智算&#xff08;DAMODEL&#xff09;是一款专为AI应用打造的智…

网红挣钱太容易了

你看最近这个三只羊小Y哥&#xff0c;因为月饼质量问题、因为大闸蟹的问题&#xff0c;上了好多次热搜&#xff0c;掉粉了几百万。还是有很多人在赶着要买他们家的东西。 你是他的粉丝&#xff0c;他是你的屠夫。只要冠以“全网最低价”的名号&#xff0c;就会有无数的粉丝跑过…

应用层协议 --- HTTP

序言 在上一篇文章中&#xff0c;我们在应用层实现了一个非常简单的自定义协议&#xff0c;我们在我们报文的首部添加了报文的长度并且使用特定的符号分割。但是想做一个成熟&#xff0c;完善的协议是不简单的&#xff0c;今天我们就一起看看我们每天都会用到的 HTTP协议 。 UR…

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手 近日&#xff0c;华语乐坛传来一则令人振奋的消息&#xff0c;11 岁的双胞胎姐妹花陈千言和陈万语荣获 2024 华语童声最受媒体欢迎女歌手和第 15 届华语金曲奖优秀童星两项大奖&#xff01; 陈千言和陈万语…

前缀和(2)_【模板】二维前缀和_模板

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(2)_【模板】二维前缀和_模板 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷&#xff08;PV&#xff09; 3.创…

单词搜索问题(涉及递归等)

目录 一题目&#xff1a; 二思路解释&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; newcode题目链接&#xff1a; 单词搜索_牛客题霸_牛客网 二思路解释&#xff1a; 思路&#xff1a;个人理解是找到word中的第一个元素&#xff0c;然后去递归的上下左右查找&am…

python实现财会人工智能分享课件

前言&#xff1a; 一、财会与人工智能之间的联系 人工智能是计算机科学的一个分支&#xff0c;旨在模拟人类智能。自20世纪50年代起&#xff0c;AI经历了多个发展阶段&#xff0c;从规则基础系统到现在的深度学习技术&#xff0c;已经在医疗、制造、金融等多个行业得到广泛应用…

Volume数据管理

Volume 容器销毁时&#xff0c;保存在容器内部文件系统中的数据都会被清除&#xff0c;为了持久化保存容器的数据&#xff0c;可以使用kubernetes Volumevolume的生命周期独立于容器&#xff0c;Pod中的容器可能被销毁和重建&#xff0c;但Volume会被保留本质上&#xff0c;Kub…

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo&#xff0c; 是一个庞大的案例库&#xff0c; 可以提供直观的参考&#xff0c; 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

Vue3:作用域插槽

目录 一.性质 1.数据传递性 2.自定义显示方式 3.复用性 4.解耦性 二.作用 1.提高灵活性 2.增强可维护性 3.简化数据流 4.提升用户体验 三.使用 1.父组件 2.子组件 四.代码 1.父组件代码 2.子组件代码 五.效果 作用域插槽&#xff08;Scoped Slots&#xff09;…

一个很小的系统为什么负载那么高?

最近帮朋友优化一个系统&#xff0c;基本的情况如下&#xff1a;虚拟机&#xff0c;centos7.9&#xff0c;oracle 11.2.0.4&#xff0c;MES系统&#xff0c;数据量<50GB,日常session数不足100&#xff1b;按说这应该是一个负载很低的系统&#xff0c;但是用户却反映系统CPU经…

jQuery——jQuery的基本使用

1、使用 jQuery 核心函数&#xff1a;$ / jQuery 2、使用 jQuery 核心对象&#xff1a;执行 $&#xff08;&#xff09;返回的对象 3、引入 jQuery 函数库&#xff1a;可以本地引入&#xff08;不用联网&#xff09;&#xff0c;也可以远程引入&#xff08;需联网&#xff09…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

分享课程:VUE数据可视化教程

在当今这个数据驱动的世界中&#xff0c;数据可视化已经成为了一种至关重要的工具&#xff0c;它帮助我们理解复杂的数据集&#xff0c;发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表&#xff0c;它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化&#xf…

2021世界人工智能大会召开 百度展示量子技术影响力

姓 名&#xff1a;王芷若 学 号&#xff1a;19020100180 学 院&#xff1a;电子工程学院 转载自&#xff1a;钥成网 原文链接&#xff1a; https://baijiahao.baidu.com/s?id1704906954970597725&wfrspider&forpc&searchword2021%E4%B8%9…