20分钟---Vue2->Vue3

news2024/11/26 2:52:36

Vue官网地址:gVue.js - The Progressive JavaScript Framework | Vue.js

选项式vs组合式

vue的两种风格,搬运官网源码:

选项式 API (Options API)​

使用选项式 API,我们可以用包含多个选项的对象来描述组件的逻辑,例如 datamethods 和 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例。

<script>
export default {
  // data() 返回的属性将会成为响应式的状态
  // 并且暴露在 `this` 上
  data() {
    return {
      count: 0
    }
  },

  // methods 是一些用来更改状态与触发更新的函数
  // 它们可以在模板中作为事件处理器绑定
  methods: {
    increment() {
      this.count++
    }
  },

  // 生命周期钩子会在组件生命周期的各个不同阶段被调用
  // 例如这个函数就会在组件挂载完成后被调用
  mounted() {
    console.log(`The initial count is ${this.count}.`)
  }
}
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

组合式 API (Composition API)​

通过组合式 API,我们可以使用导入的 API 函数来描述组件逻辑。在单文件组件中,组合式 API 通常会与 <script setup> 搭配使用。这个 setup attribute 是一个标识,告诉 Vue 需要在编译时进行一些处理,让我们可以更简洁地使用组合式 API。比如,<script setup> 中的导入和顶层变量/函数都能够在模板中直接使用。

下面是使用了组合式 API 与 <script setup> 改造后和上面的模板完全一样的组件:

<script setup>
import { ref, onMounted } from 'vue'

// 响应式状态
const count = ref(0)

// 用来修改状态、触发更新的函数
function increment() {
  count.value++
}

// 生命周期钩子
onMounted(() => {
  console.log(`The initial count is ${count.value}.`)
})
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

创建vue3项目

vue create yf_vue3_1

选择vue3

进入创建的yf_vue3_1项目中

cd yf_vue3_1

通过上图的提示,使用

npm run serve

启动项目即可

vue3核心语法

保留了绝大部分的vue2语法

<script>
import HelloWorld from "./components/HelloWorld.vue";

export default {
  name: "App",
  data() {},
  methods: {},
  components: {
    HelloWorld,
  },
};

通过setup启动组合式api

其中import 的 HelloWorld组件不需要再components中注册,导入即注册!

defineProps

组件间传值

<template>
  <div class="hello">
    <h1>{{ props.msg }}</h1>
  </div>
</template>

<script setup>
import { defineProps } from "vue";
const props = defineProps({
  msg: {
    type: String,
    require: true,
  },
});
</script>

响应式的基本类型ref()

ref(0) ref("abc"),操作值需要加.value,具体原理可以参考ts中的proxy部分。

响应式的对象类型reactive()

综合例子:

<template>
  <div class="hello">
    <h1>{{ props.msg }}</h1>

    <form>
      <label for="username">Username:</label>
      <input type="text" id="username" v-model="username" />

      <label for="password">Password:</label>
      <input type="password" id="password" v-model="password" />

      <button type="button" @click="submitForm">Submit</button>
    </form>

    <form>
      <label for="username">Username:</label>
      <input type="text" id="username1" v-model="userData.username1" />

      <label for="password">Password:</label>
      <input type="password" id="password1" v-model="userData.password1" />

      <button type="button" @click="submitForm1">Submit</button>
    </form>
  </div>
</template>

<script setup>
import { defineProps, reactive, ref } from "vue";
const props = defineProps({
  msg: {
    type: String,
    require: true,
  },
});

const username = ref("初始值");
const password = ref("");

// 提交表单数据的函数
function submitForm() {
  console.log("Username:", username.value);
  console.log("Password:", password.value);
}

const userData = reactive({
  username1: "",
  password1: "",
});
// 提交表单数据的函数
function submitForm1() {
  console.log("Username:", userData.username1);
  console.log("Password:", userData.password1);
}
</script>

浅响应shallowReactive

如果修改根属性,则多维属性会一起修改。如果只修改role这个多维属性,则不会修改。

const showData = shallowReactive({
  name: "有风",
  role: ["admin", "admin1"],
});
function updateData() {
  //showData.name = "程序猿有风";
  showData.role.push("admin2");
}

计算属性computed

const getRole = computed(() => {
  return showData.role;
});

watch与watchEffect

//监听基本属性
watch(username, (newVal, oldVal) => {
  console.log(newVal + "---" + oldVal);
});
//监听reavtive中的单个属性
watch(
  () => showData.name,
  (newVal, oldVal) => {
    console.log("监听reavtive中的单个属性:" + newVal + "---" + oldVal);
  }
);
//监听reavtive中的多个属性
watchEffect(() => {
  console.log("监听多个属性:" + showData.name + "---" + showData.role);
});

最终的完整源码

<template>
  <div class="hello">
    <h1>{{ props.msg }}</h1>

    <form>
      <label for="username">Username:</label>
      <input type="text" id="username" v-model="username" />

      <label for="password">Password:</label>
      <input type="password" id="password" v-model="password" />

      <button type="button" @click="submitForm">Submit</button>
    </form>

    <form>
      <label for="username">Username:</label>
      <input type="text" id="username1" v-model="userData.username1" />

      <label for="password">Password:</label>
      <input type="password" id="password1" v-model="userData.password1" />

      <button type="button" @click="submitForm1">Submit</button>
    </form>

    <div>
      {{ showData }}
      <br />
      <button type="button" @click="updateData">update</button>
    </div>
    <div>{{ getRole }}</div>
    <div>{{ getRole }}</div>
    <div>{{ getRole }}</div>
  </div>
</template>

<script setup>
import {
  computed,
  defineProps,
  reactive,
  ref,
  shallowReactive,
  watch,
  watchEffect,
} from "vue";
const props = defineProps({
  msg: {
    type: String,
    require: true,
  },
});

const username = ref("初始值");
const password = ref("");

// 提交表单数据的函数
function submitForm() {
  console.log("Username:", username.value);
  console.log("Password:", password.value);
}

const userData = reactive({
  username1: "",
  password1: "",
});
// 提交表单数据的函数
function submitForm1() {
  console.log("Username:", userData.username1);
  console.log("Password:", userData.password1);
}

const showData = shallowReactive({
  name: "有风",
  role: ["admin", "admin1"],
});
function updateData() {
  showData.name = "程序猿有风";
  showData.role.push("admin2");
}

const getRole = computed(() => {
  return showData.role;
});

//监听基本属性
watch(username, (newVal, oldVal) => {
  console.log(newVal + "---" + oldVal);
});
//监听reavtive中的单个属性
watch(
  () => showData.name,
  (newVal, oldVal) => {
    console.log("监听reavtive中的单个属性:" + newVal + "---" + oldVal);
  }
);
//监听reavtive中的多个属性
watchEffect(() => {
  console.log("监听多个属性:" + showData.name + "---" + showData.role);
});
</script>

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

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

相关文章

28295-2012 高温合金管材通用技术条件

声明 本文是学习GB-T 28295-2012 高温合金管材通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 1.1 本标准规定了经过热、冷加工生产的变形高温合金管材产品交货的技术要求、试验方法、检验规则 和交货条件等技术内容。 1.2 本标…

Linux常用指令(二)

目录 一、 删除空目录&#xff08;rmdir&#xff09; 二、ln 硬链接与软链接 三、新建空文件或更新文件的时间戳&#xff08;touch&#xff09; 四、比较文件内容的差异&#xff08;diff&#xff09; 五、显示当前时间或设置系统时间&#xff08;date&#xff09; 六、显…

关于解决 unable to start ssh-agent service, error :1058

前言 操作系统&#xff1a;win11 命令终端&#xff1a;Powershell 当我在终端输入命令 启动 ssh-agent 代理的时候 ssh-agent -s 很不幸出现了 unable to start ssh-agent service, error :1058以下错误 问题的解决 查看我们ssh-agent 服务是否运行&#xff0c;执行如下命令…

自动驾驶技术:现状与未来

自动驾驶技术&#xff1a;现状与未来 文章目录 引言自动驾驶技术的现状自动驾驶技术的挑战自动驾驶技术的未来结论结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训不…

代码随想录刷题 Day 22

235. 二叉搜索树的最近公共祖先 具体思路就是当小于pq的时候就往右取遍历&#xff0c;当大于的时候就往左遍历&#xff1b; lass Solution { public:TreeNode* traversal(TreeNode* current, TreeNode* p, TreeNode* q) {if (current->val > p->val && curre…

企业风险管理策略终极指南

企业风险管理不一定是可怕的。企业风险管理是一个模糊且难以定义的主题领域。它涵盖了企业的多种风险和程序&#xff0c;与传统的风险管理有很大不同。 那么&#xff0c;企业风险管理到底是什么&#xff1f;在本文中&#xff0c;我们将确定它是什么&#xff0c;提出两种常见的…

程序的编译与生成可执行文件学习笔记(二)

gcc不是编译器&#xff0c;它是一个程序 GCC&#xff08;GNU Compiler Collection&#xff09;是一款常用的编译器&#xff0c;它支持分段编译&#xff0c;可以将源代码分为预处理、编译、汇编和链接等不同的阶段进行处理。下面是GCC分段编译流程的命令示例&#xff1a; 1. 预…

【数据结构】外部排序、多路平衡归并与败者树、置换-选择排序(生成初始归并段)、最佳归并树算法

目录 1、外部排序 1.1 基本概念 1.2 方法 2、多路平衡归并与败者树 2.1 K路平衡归并 2.2 败者树 3、置换-选择排序&#xff08;生成初始归并段&#xff09;​编辑 4、最佳归并树 4.1 理论基础​编辑 4.2 构造方法 ​编辑 5、各种排序算法的性质 1、外部排序 1.1 基本概…

五分钟k8s入门到实战-应用配置

ConfigMap.png 背景 在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力&#xff0c;x现在可以满足基本的应用开发需求了。 现在我们需要更进一步&#xff0c;使用 k8s 提供的一些其他对象来标准化我的应用开发。首先就是 ConfigMap&#xff0c;从它的名…

高云FPGA系列教程(11):MultiButton按键驱动模块移植

文章目录 1. MultiButton简介2. MultiButton代码获取3. MultiButton移植4. 测试与运行本文是高云FPGA系列教程的第11篇文章。 1. MultiButton简介 MultiButton, 一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构…

华为云云耀云服务器L实例评测 | MacOS系统-宝塔建站

文章目录 1.华为云云耀云服务器L实例2.选择配置与购买2.1 华为云云耀云服务器L实例-套餐配置详情 3.宝塔镜像的使用3.1 重置实例的密码3.2 MacOS环境登录服务器3.2.1 查看内存使用情况 3.3 进入宝塔面板3.3.1 在安全组开放端口3.3.2 网站效果 1.华为云云耀云服务器L实例 云耀云…

python+pygame+opencv+gpt实现虚拟数字人直播(有趣的探索)

AI技术突飞猛进&#xff0c;不断的改变着人们的工作和生活。数字人直播作为新兴形式&#xff0c;必将成为未来趋势&#xff0c;具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作&#xff0c;提供更具个性化和多样化的互动体验&#xff0c;成为未来的一种趋…

SLAM从入门到精通(gmapping建图)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们介绍了hector slam建图。相对而言&#xff0c;hector slam建图对数据的要求比较低&#xff0c;只需要lidar数据就可以建图了。但是hector …

springboot和vue:八、vue快速入门

vue快速入门 新建一个html文件 导入 vue.js 的 script 脚本文件 <script src"https://unpkg.com/vuenext"></script>在页面中声明一个将要被 vue 所控制的 DOM 区域&#xff0c;既MVVM中的View <div id"app">{{ message }} </div…

C++17中std::filesystem::directory_entry的使用

C17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::directory_entry的使用。 std::filesystem::directory_entry&#xff0c;目录项&#xff0c;获取文件属性。此directory_entry类主要用法包括&#xff1a; (1).构造函数、…

28271-2012 米制超细牙螺纹 公差

声明 本文是学习GB-T 28271-2012 米制超细牙螺纹 公差. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了米制超细牙螺纹的公差和标记。 本标准适用于精密仪器和电子设备等领域的螺纹连接。 2 规范性引用文件 下列文件对于本文件…

BUUCTF reverse wp 65 - 70

[SWPU2019]ReverseMe 反编译的伪码看不明白, 直接动调 这里显示"Please input your flag", 然后接受输入, 再和32进行比较, 应该是flag长度要求32位, 符合要求则跳转到loc_E528EE分支继续执行 动调之后伪码可以读了 int __cdecl main(int argc, const char **arg…

差分运算放大器的放大倍数的计算及结论

由于虚断&#xff0c;流入V的电流几乎为0&#xff0c;根据分压定理可得&#xff1a; 同理&#xff0c;在V-处有&#xff1a; 由于虚短&#xff0c;可得&#xff1a; 化简可得&#xff1a; 其中&#xff1a; 称为正相放大倍数 称为反相放大倍数

学信息系统项目管理师第4版系列14_沟通管理

1. 与IT项目成功有关的最重要的四个因素 1.1. 主管层的支持 1.2. 用户参与 1.3. 有经验的项目经理 1.4. 清晰的业务目标 1.5. 依赖于项目经理和团队具有良好的沟通能力 2. 沟通的主旨 2.1. 互动双方建立彼此相互了解的关系 2.2. 相互回应 2.3. 期待能经由沟通的行为与…

计算机图像处理-中值滤波

非线性滤波 非线性滤波是利用原始图像跟模版之间的一种逻辑关系得到结果&#xff0c;常用的非线性滤波方法有中值滤波和高斯双边滤波&#xff0c;分别对应cv2.medianBlur(src, ksize)方法和cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])方法。 …