上一篇
【2025年8月最新消息】微信官方近期发布了小程序开发工具3.8.0版本,新增了对Vue3.4+的深度支持,优化了组合式API在小程序环境下的编译性能,同时引入了更智能的代码提示功能,这让Vue3在小程序开发中的体验更加流畅,下面我们就来看看最新的实战技巧。
现在用Vue3开发微信小程序已经变得非常简单了,首先确保你安装了最新版的Node.js(建议18+版本),然后通过命令行初始化项目:
npm init vue@latest my-miniprogram cd my-miniprogram npm install
接着安装微信小程序专用插件:
npm install @vue/cli-plugin-mpvue --save-dev
在vue.config.js中添加以下配置:
module.exports = { pluginOptions: { mpvue: { appid: '你的小程序appid', projectName: '你的项目名称' } } }
Vue3的组合式API在小程序中表现非常出色,这里分享几个实用技巧:
// useWxApi.js import { ref } from 'vue' export function useLogin() { const userInfo = ref(null) const login = () => { return new Promise((resolve, reject) => { wx.login({ success(res) { if (res.code) { // 这里可以添加后端登录逻辑 resolve(res.code) } else { reject(res.errMsg) } } }) }) } return { userInfo, login } }
在页面中使用:
import { useLogin } from '@/composables/useWxApi' export default { setup() { const { userInfo, login } = useLogin() const handleLogin = async () => { try { const code = await login() console.log('登录成功', code) } catch (err) { console.error('登录失败', err) } } return { userInfo, handleLogin } } }
Vue3的setup函数与小程序生命周期可以这样结合:
export default { setup() { // 相当于onLoad onLoad(() => { console.log('页面加载') }) // 相当于onShow onShow(() => { console.log('页面显示') }) // 相当于onUnload onUnload(() => { console.log('页面卸载') }) } }
// 在页面json配置中 { "usingComponents": { "lazy-image": "/components/lazy-image" } } // lazy-image组件 <template> <image :src="realSrc" :mode="mode" :lazy-load="true" @load="handleLoad" /> </template> <script setup> import { ref, onMounted } from 'vue' const props = defineProps({ src: String, mode: { type: String, default: 'aspectFill' } }) const realSrc = ref('') const observer = ref(null) onMounted(() => { observer.value = wx.createIntersectionObserver(this) observer.value.relativeToViewport().observe('.lazy-img', (res) => { if (res.intersectionRatio > 0) { realSrc.value = props.src observer.value.disconnect() } }) }) const handleLoad = () => { console.log('图片加载完成') } </script>
// usePagination.js import { ref } from 'vue' export function usePagination(apiFn, pageSize = 10) { const loading = ref(false) const finished = ref(false) const list = ref([]) const page = ref(1) const loadData = async () => { if (loading.value || finished.value) return loading.value = true try { const res = await apiFn({ page: page.value, pageSize }) list.value = [...list.value, ...res.data] page.value++ if (res.data.length < pageSize) { finished.value = true } } finally { loading.value = false } } const refresh = () => { list.value = [] page.value = 1 finished.value = false loadData() } return { list, loading, finished, loadData, refresh } }
// store.js import { reactive } from 'vue' const store = reactive({ user: null, token: '', setUser(user) { this.user = user wx.setStorageSync('user', user) }, clearUser() { this.user = null this.token = '' wx.removeStorageSync('user') wx.removeStorageSync('token') } }) // 初始化时从缓存读取 const initStore = () => { const user = wx.getStorageSync('user') const token = wx.getStorageSync('token') if (user) store.user = user if (token) store.token = token } initStore() export default store
在组件中使用:
import store from '@/store' export default { setup() { const handleLogin = () => { store.setUser({ name: '张三' }) } return { user: store.user, handleLogin } } }
// custom-navbar组件 <template> <view class="custom-navbar" :style="navbarStyle"> <view class="left" @click="handleBack"> <slot name="left"> <image v-if="showBack" src="/static/back.png" mode="aspectFit" /> </slot> </view> <view class="title"> <slot>{{ title }}</slot> </view> <view class="right"> <slot name="right"></slot> </view> </view> </template> <script setup> import { computed } from 'vue' const props = defineProps({ String, showBack: { type: Boolean, default: true }, backgroundColor: { type: String, default: '#ffffff' }, color: { type: String, default: '#000000' } }) const emit = defineEmits(['back']) const navbarStyle = computed(() => { return { backgroundColor: props.backgroundColor, color: props.color, paddingTop: wx.getSystemInfoSync().statusBarHeight + 'px', height: (wx.getSystemInfoSync().statusBarHeight + 44) + 'px' } }) const handleBack = () => { if (props.showBack) { emit('back') wx.navigateBack() } } </script> <style scoped> .custom-navbar { position: fixed; top: 0; left: 0; right: 0; display: flex; align-items: center; z-index: 999; } .left, .right { width: 80rpx; display: flex; justify-content: center; align-items: center; } { flex: 1; text-align: center; font-size: 36rpx; } </style>
在不同环境下执行不同代码:
// 开发环境调试 if (process.env.NODE_ENV === 'development') { console.log('调试信息') wx.setEnableDebug({ enableDebug: true }) } // 小程序平台特有代码 const systemInfo = wx.getSystemInfoSync() const isIOS = systemInfo.platform === 'ios'
在project.config.json中添加:
{ "setting": { "condition": { "miniprogram": { "list": [ { "name": "测试环境", "pathName": "pages/index/index", "query": "env=test", "scene": null }, { "name": "预发布环境", "pathName": "pages/index/index", "query": "env=stage", "scene": null } ] } } } }
使用小程序分包加载:
{ "pages": [ "pages/index/index" ], "subpackages": [ { "root": "packageA", "pages": [ "pages/cat/cat", "pages/dog/dog" ] } ] }
// modal组件 <template> <teleport to="#modal-container"> <view v-if="visible" class="modal-mask"> <view class="modal-content"> <slot></slot> </view> </view> </teleport> </template> <script setup> defineProps({ visible: Boolean }) </script>
在app.json中配置:
{ "usingComponents": { "modal": "/components/modal" } }
在app.wxml中添加:
<view id="modal-container"></view>
// 异步加载组件 const AsyncComponent = defineAsyncComponent(() => import('./components/HeavyComponent.vue') ) // 使用 <template> <Suspense> <template #default> <AsyncComponent /> </template> <template #fallback> <view>加载中...</view> </template> </Suspense> </template>
Vue3在微信小程序开发中的应用已经非常成熟,2025年的新特性让开发者能够构建更加高效、灵活的小程序应用,持续关注微信官方文档和Vue3的更新动态,及时应用最新的最佳实践,才能让你的小程序在性能和用户体验上保持领先。
本文由 梁香雪 于2025-08-01发表在【云服务器提供商】,文中图片由(梁香雪)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/500010.html
发表评论