vue2、vue3傻傻分不清楚

news2024/11/27 16:53:28

前端工作也做了几年了,好多东西还是分不清楚。特别是对于最基础的书写格式还是有点模糊不清,今天特地整理一下,以供日后查阅。

vue2

//最纯洁简单的一种创建组件的方式,使用基础 Vue 构造器,创建一个“子类”。
<script>
import Vue from 'vue';
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src

export default Vue.extend({
  name: 'HomeView',
  components: {
    HelloWorld,
  },
  data(){
    return {
      name:'张三',
    }
  },
  computed:{
    newName(){
      return this.name+'哈哈'
    }
  },
  watch: {
    //……
  },
  methods:{
    eventClick(){
      this.name = '李磊'
    },
    //……
  }
});
</script>

其中,由于
在这里插入图片描述
所以我们也可以直接省略掉Vue.extend,直接使用export default({……})声明模块。

vue+ts

vue2.x 对 TS 的支持并不友好,所以 vue2.x 跟 TS的整合,通常需要基于vue-class-component(官方推荐的)来用基于 class(类) 的组件书写方式。
这种编写方式可以让.vue 文件的 js 域结构更扁平,并使 vue 组件可以使用继承、混入等高级特性。

使用vue-class-component带来了很多便利:

methods 钩子都可以直接写作 class 的方法

  • computed 属性可以直接通过 get 来获得
  • 初始化 data 可以声明为class 的属性
  • 其他的都可以放到 Component 装饰器里
//注意!:多了lang="ts",用来声明使用了ts语法
<script lang="ts">
import Vue from 'vue'
import Component from 'vue-class-component'
 
 // 4.其他的都可以放到 Component 装饰器里
@Component({
  template: '<button @click="onClick">Click!</button>',
  components: {
    Component 
  },
  props: {
    propMessage: String
  },
  ……
})
// 1.methods 钩子都可以直接写作 class 的方法
export default class App extends Vue { //注意!:extends Vue是用来声明类的类型,遵从ts语法

  // 2.初始化 data 可以声明为class 的属性 
  msg = 123
  
  // 3.computed 属性可以直接通过 get 来获得
  get computedMsg () {
    return 'computed ' + this.msg
  }
 
  // method
  greet () {
    alert('greeting: ' + this.msg)
  }
}
</script>

vue-property-decorator

是基于vue-class-component扩展的一个非官方库, 主要功能就和名字一样,为vue的属性提供装饰器写法,让代码更加美观、直白。推荐使用,这个文档比较推荐可以直接链接过去学习。

vue-class

顺便说一下vuex-class是vuex和vue-class-component的绑定助手,包装了vuex, 简化了代码。在我的项目中也经常被使用到。举个例子

//cate.ts,一个模块
import {Commit,ActionContext} from 'vuex';
//ts类型定义
interface State {
    clueId: number;
    refreshTime: number
};
const state: State = {
    clueId: 0,
    refreshTime: new Date().getTime()
};
const mutations = {
    UPDATE(state: State,clueId: number) {
        state.clueId = clueId;
        state.refreshTime = new Date().getTime()
     }
};
const actions = {
    update(context: ActionContext<State, any> , clueId: number) {
        context.commit('UPDATE' , clueId);
    }
};

const getters = {
    refreshTime() {
        return state.refreshTime
    }
}
export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters
};
//index.ts
import Vue from 'vue'
import Vuex from 'vuex'

import Cate from './modules/Cate'

const modulesFiles = require.context("./modules", true, /\.ts$/);
//注意!:通过reduce方法循环,将每个js中export default出的对象放在modules中并return,最后将modules丢到Vuex.Strore中。
const modules = modulesFiles.keys().reduce((modules: any, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1");
  const value = modulesFiles(modulePath);
  modules[moduleName] = value.default;
  return modules;
}, {});

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    Cate,
    ……
  },
  strict: process.env.NODE_ENV !== 'production'
})
//装饰器:@State @Getter @Action @Mutation
import Vue from 'vue'
import Component from 'vue-class-component'
import {
  State,
  Getter,
  Action,
  Mutation,
  namespace
} from 'vuex-class'

const someModule = namespace('path/to/module')

@Component
export class MyComponent extends Vue {
  @State('foo') stateFoo
  @State(state => state.bar) stateBar
  @Getter('foo') getterFoo
  @Action('foo') actionFoo
  @Mutation('foo') mutationFoo
  @someModule.Getter('foo') moduleGetterFoo

  // 如果省略参数, 直接使用每一个 state/getter/action/mutation 类型的属性名称
  @State foo
  @Getter bar
  @Action baz
  @Mutation qux

  created () {
    this.stateFoo // -> store.state.foo
    this.stateBar // -> store.state.bar
    this.getterFoo // -> store.getters.foo
    this.actionFoo({ value: true }) // -> store.dispatch('foo', { value: true })
    this.mutationFoo({ value: true }) // -> store.commit('foo', { value: true })
    this.moduleGetterFoo // -> store.getters['path/to/module/foo']
  }
}

vue3

  • 选项式api:保持vue的传统写法

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

  • 组合式api

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

setup

//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>

setup 函数是一个新引入的组件选项,它在 Vue3 组件实例创建之前执行,主要用于封装组件所需的逻辑,主要作用如下:

  1. 接收并处理组件的 propscontext(包含 attrsslotsemit)等数据。
  2. 允许在组件内部声明响应式数据、计算属性、侦听器等。
  3. 提供一个干净、独立的环境,使得组件内部的代码更容易维护和复用。
  4. 避免在组件生命周期钩子函数(如 beforeCreatecreated 等)中编写复杂逻辑,从而提高代码的可读性和可维护性。
  5. 提供了一种在 Vue3 组件中使用 refreactive 等新特性方法的途径。

我们已经充分了解有哪些东西需要在setup中去生命,我们就可以对以上的代码进行进步的优化,这是我在项目中常会用到的一种写法。

//注意!:没有setup
<script>
//一部分代码可以抽离开来
import { ref, onMounted ,defineComponent} from 'vue'
export default defineComponent({
  name: "ManageBaseInfo",
  components: { MgFileView , MgComplexView},
});
</script>

<script setup>
const count = ref(0)
……
</script>

好,以上就是全部啦!

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

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

相关文章

2.认识中台

1.数字化中台初步认识与建设策略 中台的定义 阿里对中台的定义: 中台是一个基础的理念和架构&#xff0c;我们要用中台的思想建设、联通所有基础服务&#xff0c;共同支持上端的业务。业务中台更多的是支持在线业务&#xff0c;数据中台则提供基础数据处理能力和很多的数据产…

基于SDN技术构建多平面业务承载网络

随着企业数字化的浪潮席卷各个行业&#xff0c;传统网络架构面临着更为复杂和多样化的挑战。企业正在寻找一种全面适应数字化需求的网络解决方案。随着软件定义网络&#xff08;SDN&#xff09;的发展&#xff0c;“多业务SDN一张网”解决方案为企业提供了一种全新的网络架构&a…

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时&#xff0c;我进行HTTP post传输报告负载时&#xff0c;由于SSL验证设置为True&#xff0c;请求失败&#xff0c;错误如下&#xff1a;(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…

Java进阶笔记(面向对象后, 持续更新)

常用API 游戏打包成exe 考虑的因素 要有图形化界面代码要打包起来游戏用到的图片也要打包JDK也要打包 核心步骤 把所有代码打包成一个压缩包, jar后缀的压缩包把jar包转换成exe安装包把第二部的exe, 图片, JDK整合在一起, 变成最终的exe安装包 1. Math 是一个帮助我们用…

人脸106和240点位检测解决方案

人脸识别技术已经深入到我们生活的各个领域&#xff0c;从手机解锁、门禁系统到视频娱乐化等&#xff0c;都离不开高精度的人脸关键点检测。美摄科技作为行业的领军企业&#xff0c;一直致力于提供最先进、最稳定的人脸识别技术&#xff0c;近日&#xff0c;我们推出了全新的10…

阿桂天山的小工具:我将16个Excel文件中31万多条数据拆分成318个文件

1.话不多说,先上图看效果 2.技术说明及实用源码 2.1)pythonflaskpandas , 由于我的开发环境版本问题,为了能读xls,xlsx,但又不想升级,只能通过xlrd 1.2.0读取xls,xlsx文件再转换成dict字典格式,再通过 data pd.DataFrame(dict_data)实现类型转换 2.2)实用代码,保证不丢任何一行…

深入探讨TensorFlow:张量与矩阵

在机器学习和深度学习领域中&#xff0c;TensorFlow作为一款强大且受欢迎的开源机器学习框架&#xff0c;为研究人员和开发者提供了丰富的工具和资源。在TensorFlow中&#xff0c;张量&#xff08;tensor&#xff09;和矩阵&#xff08;matrix&#xff09;是核心概念&#xff0…

【vue】下载导出excel

下载导出excel 首先使用的tdesign框架&#xff0c;要导出后端返回的数据流excel 遇见的问题 下载的文件&#xff0c;里边的内容是undefined 观察报错 一看就知道并不是后端的报错&#xff0c;后端不可能是undefined 在强烈的好奇心驱动下&#xff0c;看了下接口&#xff0…

Python实现Tom与Jerry

文章目录 写在前面系列文章绘图基础Tom&Jerry写在后面 写在前面 汤姆永远抓不到杰瑞&#xff0c;我们的故事永远不会结束&#xff01;本期博主给大家带来了Tom&Jerry&#xff0c;快来看看吧~&#xff08;Tom和Jerry可以修改成自己想修改的名字哦&#xff09; 系列文章…

解决SSH连接自动断开的问题

一、环境 centos7.6 xshell7 二、目标 ssh长联状态&#xff0c;不主动断开 三、实施 1.修改/etc/profile文件 末尾添加export TMOUT0 vim /etc/profileexport TMOUT02.修改/etc/ssh/sshd_config文件 默认都被注释掉&#xff0c;放开并设置CAI参数为0-60间 vim /etc…

轻松一刻|Walrus CLI与CI/CD工具集成,轻松部署2048游戏

Walrus 是一款开源的基于平台工程理念、以应用为中心、以完整应用系统自动化编排交付为目标进行设计开发的云原生应用平台&#xff0c;简化和自动化应用部署与发布流程并与现有的 CI/CD 流水线无缝集成。今天我们来点有趣的&#xff0c;跟随本教程&#xff0c;一起将 Walrus CL…

2023年第九届数维杯国际大学生数学建模挑战赛A题

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行&#xff0c;小云学长又在第一时间给大家带来最全最完整的思路代码解析&#xff01;&#xff01;&#xff01; A题思路解析如下&#xff1a; 完整版解题过程及代码&#xff0c;稍后继续给大家分享~ 更多题目完整解析点…

数据结构与算法【队列】的Java实现

队列&#xff1a;以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#xff0c;添加的一端称为尾&#xff0c;移除的一端称为头。 通用接口 public interface Queue<E> {/*** 插入队列*/boolean offer(E value);/*** 从…

Web浏览器的同源策略(same-origin policy)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

卷积神经网络(CNN)mnist手写数字分类识别的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化5.调整图片格式 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、知识点详解1. MNIST手写数字数据集介绍2. 神经网络程序说明3. 网…

6.docker运行mysql容器-理解容器数据卷

运行mysql容器-理解容器数据卷 1.什么是容器数据卷2.如何使用容器数据卷2.1 数据卷挂载命令2.2 容器数据卷的继承2.3 数据卷的读写权限2.4 容器数据卷的小实验&#xff08;加深理解&#xff09;2.4.1 启动挂载数据卷的centos容器2.4.2 启动后&#xff0c;在宿主机的data目录下会…

IDEA创建SpringBoot的多模块项目教程

最近在写一个多模块的SpringBoot项目&#xff0c;基于过程总了一些总结&#xff0c;故把SpringBoot多个模块的项目创建记录下来。 首先&#xff0c;先建立一个父工程&#xff1a; &#xff08;1&#xff09;在IDEA工具栏选择File->New->Project &#xff08;2&#xff0…

热点检测/降级框架Akali的部分原理解析

发现个“轻量级本地化热点检测/降级框架 这个框架名为Akali,项目地址&#xff1a;https://gitee.com/bryan31/Akali主要有两个作用 1&#xff1a;热点检测及处理 2&#xff1a;降级检测及处理 从官网文档来看使用是比较简单的&#xff0c;一个注解就能搞定 怀着好奇的心情c…

Echarts 实现两两柱图重叠(背景和实际值柱图)

Echarts实现两两重叠柱状图_echarts 重叠柱状图_Web_阿凯的博客-CSDN博客 引用启发的博客 先来效果&#xff1a; option {backgroundColor: #03213D,animation: true, // 控制动画是否开启animationDuration: 1000, // 动画的时长, 它是以毫秒为单位animationDuration: func…

数据结构C语言之线性表

发现更多计算机知识&#xff0c;欢迎访问Cr不是铬的个人网站 1.1线性表的定义 线性表是具有相同特性的数据元素的一个有限序列 对应的逻辑结构图形&#xff1a; 从线性表的定义中可以看出它的特性&#xff1a; &#xff08;1&#xff09;有穷性&#xff1a;一个线性表中的元…