草庐IT

在 Vue2 与 Vue3 中构建相同的组件

lio_zero 2023-09-28 原文

本文已整理到 Github,地址 ? blog

如果我的内容帮助到了您,欢迎点个 Star ??? 鼓励鼓励 :) ~~

我希望我的内容可以帮助你。现在我专注于前端领域,但我也将分享我在有限的时间内看到和感受到的东西。


Vue2 和 Vue3 有什么不同? 我们以一些简单的示例,来看看具体的变化。

你可以查看 Vue3 文档,以了解更加详细的内容示例。

创建模板

Vue3 支持 Fragments,这意味着组件可以有多个根节点。

<template>
  <div class="app"></div>
  <div class="popup"></div>
</template>

设置数据

主要的区别所在:Options APIComposition API

  • Options API 将我们的代码分为不同的属性:datacomputedmethods 等。
  • Composition API 允许我们按函数而不是属性的类型对代码进行分组。

假设我们只有两个 data 属性:usernamepassword

Vue2 代码看起来像这样,我们只需在 data 属性中写上这两个值。

export default {
  props: {},
  data () {
    return {
      username: '',
      password: ''
    }
  }
}

在 Vue3 中,使用一种新的 setup() 方法进行所有组件初始化的工作。

此外,为了使开发人员能够更好地控制响应性数据,我们可以直接访问 Vue 的 reactive API。

创建响应性数据包括三个步骤:

  • 从 vue 导入 reactive
  • 使用 reactive 方法声明我们的数据
  • 让我们的 setup 方法返回响应式数据,以便我们的模板可以访问它

就代码而言,它看起来有点像这样。

import { reactive } from 'vue'

export default {
  props: {},
  setup () {
    const state = reactive({
      username: '',
      password: ''
    })

    return { state }
  }
}

然后,在我们的模板中,像 state.usernamestate.password 那样访问它们。

在 Vue2 与 Vue3 中创建方法

Vue2 Options API 有一个单独的方法部分。在这里,我们可以定义所有的方法,并以我们想要的方式组织它们。

export default {
  props: {},
  data () {},
  methods: {
    login () {}
  }
}

Vue3 Composition API 中的 setup() 方法也可以处理方法。它的工作原理与声明数据有些类似,我们必须先声明我们的方法,然后 return 它,以便组件的其他部分可以访问它。

export default {
  props: {},
  setup () {
    // ...
    const login = () => {}
    return { 
      login
    }
  }
}

生命周期钩子

在 Vue2 中,我们可以直接从组件选项访问生命周期钩子。以下使用到 mounted 钩子打印一些内容:

export default {
  data () {},
  mounted () {
    console.log('component mounted')
  },
  methods: {}
}

现在使用 Vue3 Composition API,几乎所有内容都在 setup() 方法内部。这包括 mounted 的生命周期钩子。

但是,默认情况下不包括生命周期钩子,因此我们必须导入 onMounted 方法作为在 Vue3 中调用的方法。

然后,在 setup() 方法中,我们可以通过传递函数来使用 onMounted 方法。

import { reactive, onMounted } from 'vue'

export default {
  props: {},
  setup () {
    // ...
    onMounted(() => {
      console.log('component mounted')
    })
    // ...
  }
}

计算属性 — computed

让我们添加一个将用户名转换为小写字母的 computed 属性。

为了在 Vue2 中实现这一点,我们向 options 对象添加一个 computed

export default {
  // .. 
  computed: {
    lowerCaseUsername () {
      return this.username.toLowerCase()
    }
  }
}

您可能也注意到了,在 Vue3 中使用一些方法,您需要从 vue 中导出它们,才能够使用。

Vue3 的设计允许开发人员导入他们所使用的内容,并且在他们的项目中没有不必要的包。基本上,他们不希望开发人员必须包含他们从未使用过的东西,这在 Vue2 中正成为一个日益严重的问题。

因此,要在 Vue3 中使用 computed 属性,首先必须将 computed 导入到组件中。

然后,类似于我们之前创建 reactive 数据的方式,在添加一个属性,如下所示:

import { reactive, onMounted, computed } from 'vue'

export default {
  props: {},
  setup () {
    const state = reactive({
      username: '',
      password: '',
      lowerCaseUsername: computed(() => state.username.toLowerCase())
    })

    // ...
  }
}

访问 props

访问 props 在 Vue2 和 Vue3 之间的一个重要区别,this 意味着完全不同。

在 Vue2 中,this 几乎总是指组件,而不是特定的属性。虽然这让表面上的事情变得简单,但它使类型支持成为一种痛苦。

但是,我们可以很容易地访问 props,让我们添加一个简单的示例,例如在 mounted 钩子期间打印 title

export default {
  props: {
    title: {
      type: String,
      default: 'Vue2'
    }
  },
  mounted () {
    console.log('title: ' + this.title)
  }
}

但是在 Vue3 中,我们不再使用 this 来访问 props,发送事件和获取属性。相反,setup() 方法采用两个参数:

  • props — 对组件 props 的不可变访问
  • context — Vue3 公开的选定属性(emitslotsattrs

使用 props 参数,上面的代码如下所示。

setup (props) {
  onMounted(() => {
    console.log('title: ' + props.title)
  })
}

emit 事件

同样,在 Vue2 中发出事件非常简单,但是 Vue3 使您可以更好地控制如何访问属性/方法。

假设在我们的例子中,当我们按下提交按钮时,我们想向父组件发出一个 login 事件。

Vue2 代码只需调用 this.$emit 并传入我们的有效负载对象即可。

login() {
  this.$emit('login', {
    username: this.username,
    password: this.password
  })
}

然而,在 Vue3 中,我们现在知道 this 不再意味着相同的事情,所以我们必须以不同的方式来做。

幸运的是,context 对象暴露了 emit,它提供了与 this.$emit 相同的东西。

我们所要做的就是将 context 作为第二个参数添加到 setup 方法中。我们将对 context 对象进行解构,使代码更加简洁。

然后,我们只需要调用 emit 发送事件即可。然后,像以前一样,emit 方法采用两个参数:

  • 事件名称
  • 与事件一起传递的有效负载对象
setup(props, { emit }) {
  const login = () => {
    emit('login', {
      username: state.username,
      password: state.password
    })
  }
}

最后

Vue2 和 Vue3 中的所有概念都是相同的,但是我们访问属性的某些方式已经有所变化。

总的来说,我认为 Vue3 将帮助开发人员编写更有组织的代码,特别是在大型项目中。这主要是因为 Composition API 允许您按特定功能将代码分组在一起,甚至可以将功能提取到自己的文件中,然后根据需要将其导入组件中。

有关在 Vue2 与 Vue3 中构建相同的组件的更多相关文章

  1. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  2. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action - 2

    让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来

  5. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  6. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  7. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  8. ruby-on-rails - 多次选择一个随机数,但绝不会两次选择相同的随机数 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?

  9. ruby-on-rails - 如何通过 POST 发送多个相同的键/参数? - 2

    如果我必须在一个HTTP请求中发送一堆post参数,所有这些参数都具有相同的名称,我该如何构建要发布的data对象?想象一个带有一些复选框的表单,它们都具有相同的name属性但具有不同的值(如果它们被选中):我想用ruby​​构建它(但它需要根据在表单上选择的内容动态创建):data={"color"=>"red","color"=>"green","color"=>"blue"}然后将数据发送到某个URL:Net::HTTP.post_form(url,data)我无法控制接收端,所以我必须发送它期望接收的参数。怎么办? 最佳答案

  10. ruby - 使2个数组大小相同 - 2

    2个数组的数组:a=[[1,2],[22,11],[18,9]]b=[[1,81]]用[0,0]填充第二个的最佳方法是什么,以便它们具有相同的大小? 最佳答案 b.fill(b.size..a.size-1){[0,0]} 关于ruby-使2个数组大小相同,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/29725615/

随机推荐