vue2和vue3区别 浅析

数据响应原理

vue2

通过 Object.defineProperty 来更新数据,只会监听使用Object.defineProperty创建的(初始化)的数据,并通过订阅方式进行发布,在初始化之外的数据,不会受到监听;

在数据初始化时,定义一个对象

data() {
    return {
        obj:{
            id:1,
            name: '标题'
        }
     }
}

这时vue是通过Object.defineProperty()obj对象的idname属性 getset行为监听成为响应式,如果在初始化之后,再往obj里面新增属性,就不会产生响应式效果;

解决方法可以使用 vue提供的全局方法Vue.set( target, propertyName/index, value ) 修改成为响应式;

vue2源码解析:vue2数据响应式原理解析-CSDN博客

vue3

1:使用proxy代理对象,

使用reactive修改复杂数据,例如 objectarray,通过创建proxy实例对象,对数据进行处理

优势:1:defineProperty()只能对某个属性进行监听,不能对整个对象进行监听;

页面结构

vue2使用选项类型api,data,computed,methds,通过属性的方式进行书写;

vue3使用合成型api书写,以方法的方式进行分块书写不同的功能点;

vue3 在基本使用中案例使用的是setup()钩子形式,同时也提示了使用<script setup>人体工学的方式;<script setup>setup()方法的语法糖;

<script setup>书写起来的优势:

  1. 更简洁的代码;

  2. 可以使用typescript声明prop和自定义事件;

  3. 更好的运行时性能;

  4. 更好的IDE类型推导性能;

v-model

vue2的v-model的组件使用方式在官网上也有讲解:在组件上使用 表单输入绑定 — Vue.js

texttextarea元素使用value propinput事件

checkboxradio使用的 value propchange事件

select 使用的也是 value propchange事件

例如:

<input type="text" :value="" @input="$emit('input',$event.target.value)"></input>
<template>
  <div>
    <input type="text" :value="value" @input="$emit('input',$event.target.value)">
  </div>
</template>
​
<script>
export default {
  props: {
    value: String,  // 默认接收一个名为 value 的 prop
  }
}
</script>

使用 input的原生属性 获取内容再提交 @input="$emit('input',$event.target.value)"

在vue3的组件中实现vue2 v-model方式

定义一个input组件

声明html

<template>
  <div>
    <input type="text" :value="value" @input="$emit('input', handleInputChange($event))" />
       <!-- @input="$emit('input', $event.target.value) -->
  </div>
</template>

项目中做了类型检查,所以$event.target.value不能直接使用,做了一个函数处理类型 handleInputChange

js部分

<script lang="ts" setup>
withDefaults(
  defineProps<{
    value: string
  }>(),
  {
    value: '',
  }
)
const handleInputChange = (event: Event) => (event.target as HTMLInputElement).value
​
defineEmits(['input'])
</script>

因为我用到的是 ts,所以里面有withDefaults

在父组件中正常引入子组件,并在html中使用

子组件:<my-input :value="'msg'" @input="handlerChanger"></my-input>

页面显示是我给的默认值:msg, input输入内容时,也会在 handlerChanger中显示

vue3更新的方式 是把vue2 html中默认的input 改成 update:modelValue

vue3 废除 model 选项和 .sync 修饰符

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue1和Vue2之间存在一些重要区别。首先,Vue2引入了一些新的语法和功能,使得代码更加简洁和易于维护。例如,在Vue1中,Vue实例的生命周期钩子函数中创建和挂载的顺序是固定的,而在Vue2中,可以通过created和mounted钩子函数来分别处理实例创建和挂载后的逻辑。 此外,Vue2的运行时版本相对于完整版本来说更加轻量,因为它不包含编译器。运行时版本适用于当我们在构建过程中使用Vue单文件组件(SFCs)的时候。而完整版包含了编译器,可以直接处理模板字符串,更适合开发环境和需要即时编译的场景。 另一个区别是在Vue2中,可以使用render函数来构建视图,这在运行时版本中特别有用。通过render函数,我们可以使用JSX或者创建虚拟DOM的方式来定义视图结构。这种方式比起Vue1中的模板语法更加灵活和可扩展。 总之,Vue2相对于Vue1来说引入了一些新的语法和功能,使得代码更加简洁、易于维护,并提供了更轻量的运行时版本和更灵活的视图构建方式。这些改进使得Vue2成为更加强大和便捷的前端开发框架。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中created和mounted的区别浅析](https://download.csdn.net/download/weixin_38500944/12938173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [浅析 Vue 的两个版本](https://blog.csdn.net/sinat_38021004/article/details/119936290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值