uniapp项目vue2升级vue3

看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题。

uniapp升级vue3官方指南

  1. 我是先去vue官网看了下vue3的组合式api,有个大概了解,方便升级使用。
  2. 然后根据uniapp升级vue3官方指南把框架层面的先更改。
  3. 测试访问没问题后再做代码上的更改。(vue3兼容vue2的代码风格)

把代码风格改为组合式api

简单总结组合式api就是把原有的data,methods等等这些以前分开的代码块,都可以放在一起了,其他的刚开始不要多想。因为我第一遍在看vue官网的时候,看的稀里糊涂。

  1. vue2的data和mehtod代码:
data() {
			return {
				dataA: {},
				dataB: [],
				...
			}
	},
methods: {
			methodA() {},
			methodB() {},
			...
}
		

vue3的data和mehtod写法:

import {ref,reactive,toRefs} from 'vue'
setup() {
	#方式1(这是我刚开始的写法)
	#这个写法有个很大的弊端就是如果我定义了很多data和method后,return代码会出现很长
	#return{a,b,c,d,e,f,g........}
	const dataA = ref({})
	const dataB = ref([])
	const methodA = () => {
		#注意:必须加value
		console.log(dataA.value);
	}
	const methodB = () => {}
	#必须return出去才能在view中使用
	return {dataA,dataB,methodA,methodB}
	#方式2(创建一个对象包裹,最后只需要返回这个对象即可)
	#方式2的代码更简洁且不需要加value,跟以前使用vue2区别不大。
	const v3data = reactive({
		dataA:{},
		dataB:{},
		methodA:() => {
			#无需加value
			console.log(v3data.dataA);
		},
		methodB:() => {}
	})
	return {
				#只需这样返回即可,toRefs的作用自行搜索,这里不做解释。
				...toRefs(v3Data)
		}
	
}
		
  1. vue2中父子组件的调用方式
#parent.vue

<template>
  <div>
      <child ref="childRef" @myClick="onChildClick"/>
      <Button type="primary" @click="parentClick">触发子组件方法</Button>
  </div>
</template>

<script>
export default {
  methods: {
    parentClick() {
    	#父组件调用子组件方法
     	this.$childRef.childMethod()
    },
    onChildClick(){
    	console.log('子组件调用')
    }
  }
}
</script>
 # child .vue
<template>
  <div>
    <h1>子组件</h1>
    <Button type="primary" @click="sonClick">触发父组件方法</Button>
  </div>
</template>

<script>
export default {
 methods: {
    sonClick () {
      #子组件调用父组件
      this.$emit('myClick');
    },
    childMethod(){
	}
  }
}
</script>

vue3中父子组件的调用方式

#parent.vue

<template>
  <div>
      <child ref="childRef" @myClick="onChildClick"/>
      <Button type="primary" @click="parentClick">触发子组件方法</Button>
  </div>
</template>

<script>
import {ref,reactive,toRefs} from 'vue'
export default {
	setup() {
		const v3data = reactive({
			#在这里定义一个和子组件ref名称相同的对象置为null,vue会自动给赋值
			childRef:null,
			parentClick:()=>{
		    	#父组件调用子组件方法
		     	v3data.childRef.childMethod()
		    },
		    onChildClick:()=>{
		    	console.log('子组件调用')
		    }
	    })
	    #这里一定要return出去,否则childRef一直为null
	    return {...toRefs(v3Data)}
}

}
</script>
 # child .vue
<template>
  <div>
    <h1>子组件</h1>
    <Button type="primary" @click="sonClick">触发父组件方法</Button>
  </div>
</template>

<script>
import {ref,reactive,toRefs} from 'vue'
export default {
	setup(props,context) {
		const v3data = reactive({
			sonClick () {
		      #子组件调用父组件
		      context.$emit('myClick');
		    },
		    childMethod(){
			}
	    })
	  return {...toRefs(v3Data)}
}

</script>

  1. vue3中如何替代this(官方已不推荐,只作为知识点)
	import {ref,getCurrentInstance} from 'vue'
	export default {
			#proxy相当于vue2的this
			const {proxy} = getCurrentInstance()
	}

网上说提升30%性能,或许我这个项目太小,没感到明显差距,不过组合式api确实是简单方便很多。
另外vue3废弃了filter,可以改用方法调用或者computed。
先写到这里,码字不易,如有错误,请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要创建一个Vue3的uniapp项目,可以按照以下步骤进行操作: 1. 打开命令行,输入以下命令来创建一个基于Vue3和Vite的uniapp工程: ``` npx degit dcloudio/uni-preset-vue#vite-ts project ``` 这将创建一个以TypeScript开发的uniapp工程。 2. 打开创建的工程,在App.vue文件中进行一些需求的更改。你可以根据具体需求修改其中的代码,比如在`<script>`标签中可以使用`mapMutations`导入`vuex`的`mapMutations`函数,并在`methods`中使用这个函数进行一些操作,比如保存登录信息。另外,你还可以根据需要修改`onLaunch`、`onShow`、`onHide`等生命周期函数的逻辑。 ``` <script> import {mapMutations} from 'vuex' export default { onLaunch: function() { console.warn('当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!') console.log('App Launch') }, onShow: function() { console.log('App Show') // 读取本地缓存,存储到VUEX中 uni.getStorageSync('userInfo') // 调用保存登陆信息操作 // 存储相应的token,isAuth,userInfo等数据 }, onHide: function() { console.log('App Hide') }, methods: { ...mapMutations(['保存登陆信息']) } } </script> ``` 3. 根据需要进行路由配置。如果在app.json中出现了类似于"tabBar"["pagePath"]: "pages/index2/index" need in ["pages"]的报错,这可能是因为页面路径配置有误。你需要在app.json中正确配置页面路径使其满足需求。 以上是创建Vue3的uniapp项目的步骤和一些相关代码的说明。请根据具体需求进行操作和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [uniapp创建vue3+vite项目](https://blog.csdn.net/solocao/article/details/128513520)[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_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [uniapp创建vue3项目](https://blog.csdn.net/weixin_57844432/article/details/131205132)[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_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值