Vue3實(shí)現(xiàn)微信支付寶PC端支付的步驟(附實(shí)例代碼)
前言
核心思想:無(wú)論是微信還是支付寶,PC端支付都遵循一個(gè)共同模式:“前端發(fā)起 -> 后端下單 -> 前端引導(dǎo)跳轉(zhuǎn)/展示二維碼 -> 用戶(hù)支付 -> 后端處理回調(diào)”。前端的主要職責(zé)是**“發(fā)起”和“引導(dǎo)”**。
下面我將分別詳細(xì)講解這兩種支付方式的實(shí)現(xiàn)步驟,并提供Vue 3的代碼示例。
準(zhǔn)備工作
- 商戶(hù)資質(zhì):你的公司需要在微信商戶(hù)平臺(tái)和支付寶開(kāi)放平臺(tái)注冊(cè)并簽約相關(guān)支付產(chǎn)品(如微信的Native支付、支付寶的電腦網(wǎng)站支付)。
- 后端接口:你需要后端同學(xué)提供以下接口:
- 微信支付下單接口:例如
POST /api/payment/wechat-native
。前端傳遞商品ID、金額等信息,后端調(diào)用微信統(tǒng)一下單API后,返回一個(gè)二維碼鏈接 (code_url
)。 - 支付寶支付下單接口:例如
POST /api/payment/alipay-pc
。前端傳遞信息,后端調(diào)用支付寶下單API后,返回一個(gè)包含完整form表單的HTML字符串。 - 支付狀態(tài)查詢(xún)接口:例如
GET /api/payment/status?orderId=xxx
。前端用于在用戶(hù)支付后,主動(dòng)向后端查詢(xún)訂單是否已成功。
- 微信支付下單接口:例如
- 前端環(huán)境:Vue 3 +
axios
(用于API請(qǐng)求)。
一、 微信支付 (Native Pay / 掃碼支付)
微信PC端支付最常用的方式是 Native Pay,即在網(wǎng)頁(yè)上顯示一個(gè)二維碼,用戶(hù)用手機(jī)微信掃碼完成支付。
流程分解
- 創(chuàng)建訂單:用戶(hù)在你的網(wǎng)站上點(diǎn)擊“去支付”。
- 前端請(qǐng)求下單:前端調(diào)用后端的微信支付下單接口,并傳遞訂單信息。
- 后端返回二維碼鏈接:后端與微信服務(wù)器交互后,會(huì)得到一個(gè)
code_url
,這是一個(gè)特殊的URL,內(nèi)容是微信支付二維碼的信息。后端將這個(gè)code_url
返回給前端。 - 前端生成并展示二維碼:前端使用一個(gè)二維碼生成庫(kù)(如
qrcode.vue
)將code_url
轉(zhuǎn)換成二維碼圖片并顯示出來(lái)。 - 前端輪詢(xún)支付狀態(tài):在二維碼顯示后,前端啟動(dòng)一個(gè)定時(shí)器,每隔幾秒鐘就調(diào)用后端的“支付狀態(tài)查詢(xún)接口”,詢(xún)問(wèn)訂單是否已支付成功。
- 用戶(hù)掃碼支付:用戶(hù)用手機(jī)微信掃描二維碼,輸入密碼完成支付。
- 后端接收異步通知:微信服務(wù)器會(huì)將支付成功的結(jié)果通過(guò)一個(gè)異步的HTTP請(qǐng)求(回調(diào))通知到你的后端服務(wù)器。后端收到通知后,更新訂單狀態(tài)為“已支付”。
- 前端輪詢(xún)得知成功:前端的輪詢(xún)請(qǐng)求最終會(huì)從后端那里得到“已支付”的狀態(tài),此時(shí)前端停止輪詢(xún),并給用戶(hù)顯示支付成功的提示,然后跳轉(zhuǎn)到成功頁(yè)面。
Vue 3 代碼實(shí)現(xiàn) (Payment.vue)
1. 安裝二維碼庫(kù)
npm install qrcode.vue
2. 編寫(xiě)組件
<template> <div class="payment-container"> <h2>訂單支付</h2> <div v-if="!paymentSuccess"> <div v-if="wechatCodeUrl" class="qrcode-section"> <h3>微信支付</h3> <p>請(qǐng)使用微信掃描下方二維碼完成支付</p> <qrcode-vue :value="wechatCodeUrl" :size="200" level="H" /> <p class="notice">二維碼將在 {{ countdown }} 秒后過(guò)期</p> </div> <div v-else> <p>正在生成支付二維碼,請(qǐng)稍候...</p> </div> </div> <div v-if="paymentSuccess"> <h3>支付成功!</h3> <p>正在跳轉(zhuǎn)到訂單詳情頁(yè)面...</p> </div> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import QrcodeVue from 'qrcode.vue'; import axios from 'axios'; // 假設(shè)已配置 const route = useRoute(); const router = useRouter(); const wechatCodeUrl = ref(''); const paymentSuccess = ref(false); const countdown = ref(300); // 假設(shè)二維碼5分鐘過(guò)期 let pollTimer = null; let countdownTimer = null; const orderId = route.query.orderId; // 從路由獲取訂單ID // 1. 獲取微信支付二維碼 const getWechatPayQrcode = async () => { try { const response = await axios.post('/api/payment/wechat-native', { orderId }); wechatCodeUrl.value = response.data.code_url; // 成功獲取二維碼后,開(kāi)始輪詢(xún)和倒計(jì)時(shí) startPolling(); startCountdown(); } catch (error) { console.error('獲取微信支付二維碼失敗:', error); alert('支付二維碼生成失敗,請(qǐng)重試!'); } }; // 2. 輪詢(xún)支付狀態(tài) const checkPaymentStatus = async () => { try { const response = await axios.get(`/api/payment/status?orderId=${orderId}`); if (response.data.status === 'SUCCESS') { paymentSuccess.value = true; stopPolling(); // 支付成功,停止輪詢(xún) // 跳轉(zhuǎn)到成功頁(yè)面 setTimeout(() => { router.push(`/order-detail/${orderId}`); }, 2000); } } catch (error) { console.error('查詢(xún)支付狀態(tài)失敗:', error); } }; const startPolling = () => { // 每3秒查詢(xún)一次 pollTimer = setInterval(checkPaymentStatus, 3000); }; const stopPolling = () => { if (pollTimer) { clearInterval(pollTimer); } if (countdownTimer) { clearInterval(countdownTimer); } }; const startCountdown = () => { countdownTimer = setInterval(() => { if(countdown.value > 0) { countdown.value--; } else { stopPolling(); alert('二維碼已過(guò)期,請(qǐng)刷新頁(yè)面重試'); } }, 1000); } onMounted(() => { if (orderId) { getWechatPayQrcode(); } else { alert('訂單ID不存在!'); } }); // 組件卸載時(shí),清除定時(shí)器,避免內(nèi)存泄漏 onUnmounted(() => { stopPolling(); }); </script> <style scoped> .payment-container { text-align: center; padding: 40px; } .qrcode-section { display: inline-block; border: 1px solid #eee; padding: 20px; } .notice { color: #999; } </style>
二、 支付寶支付 (電腦網(wǎng)站支付)
支付寶PC端支付通常是跳轉(zhuǎn)到一個(gè)新的頁(yè)面(支付寶的收銀臺(tái)),用戶(hù)在那個(gè)頁(yè)面完成支付后,再跳回你的網(wǎng)站。
流程分解
- 創(chuàng)建訂單:同微信支付。
- 前端請(qǐng)求下單:前端調(diào)用后端的支付寶支付下單接口。
- 后端返回Form表單:后端與支付寶服務(wù)器交互后,支付寶會(huì)返回一段包含支付信息的、會(huì)自動(dòng)提交的HTML Form表單字符串。后端將這個(gè)字符串原封不動(dòng)地返回給前端。
- 前端執(zhí)行頁(yè)面跳轉(zhuǎn):前端接收到這個(gè)HTML字符串后,不能直接用
v-html
渲染它。正確的做法是創(chuàng)建一個(gè)新的空白頁(yè)面(或iframe
),將這段HTML寫(xiě)入其中。瀏覽器解析后,表單會(huì)自動(dòng)提交,頁(yè)面就會(huì)跳轉(zhuǎn)到支付寶的收銀臺(tái)。 - 用戶(hù)在支付寶頁(yè)面支付:用戶(hù)掃碼或登錄支付寶賬號(hào)完成支付。
- 支付寶同步跳轉(zhuǎn) (Return URL):用戶(hù)支付成功后,支付寶會(huì)根據(jù)你后端配置的
return_url
,將用戶(hù)的瀏覽器重定向回你的網(wǎng)站的某個(gè)頁(yè)面(例如支付成功頁(yè)),并在URL中附帶上訂單號(hào)、支付金額等參數(shù)。 - 前端處理同步跳轉(zhuǎn):前端的成功頁(yè)面從URL中獲取參數(shù),可以先給用戶(hù)一個(gè)“支付成功”的初步提示。但此時(shí)不能100%確認(rèn)支付成功,因?yàn)檫@個(gè)跳轉(zhuǎn)是可以被偽造的。
- 后端接收異步通知 (Notify URL):與此同時(shí),支付寶服務(wù)器也會(huì)向你后端配置的
notify_url
發(fā)送一個(gè)異步的POST請(qǐng)求,這才是確認(rèn)支付成功的最終依據(jù)。后端收到通知并驗(yàn)簽成功后,才會(huì)更新訂單狀態(tài)。 - 前端確認(rèn)最終狀態(tài):前端成功頁(yè)面最好再調(diào)用一次“支付狀態(tài)查詢(xún)接口”來(lái)獲取最準(zhǔn)確的訂單狀態(tài),然后向用戶(hù)展示最終結(jié)果。
Vue 3 代碼實(shí)現(xiàn)
1. 支付發(fā)起組件 (Payment.vue)
<template> <div class="payment-container"> <h2>訂單支付</h2> <button @click="handleAlipay">使用支付寶支付</button> <!-- 這里就是用來(lái)接收和提交支付寶表單的容器 --> <div ref="alipayFormContainer"></div> </div> </template> <script setup> import { ref } from 'vue'; import { useRoute } from 'vue-router'; import axios from 'axios'; const route = useRoute(); const orderId = route.query.orderId; const alipayFormContainer = ref(null); // 用于獲取DOM元素 const handleAlipay = async () => { try { const response = await axios.post('/api/payment/alipay-pc', { orderId }); const formHtml = response.data.form_html; // **關(guān)鍵步驟:提交支付寶返回的表單** if (alipayFormContainer.value) { // 1. 將表單HTML寫(xiě)入容器 alipayFormContainer.value.innerHTML = formHtml; // 2. 找到表單并觸發(fā)表單提交 const form = alipayFormContainer.value.querySelector('form'); if (form) { form.submit(); } else { throw new Error('Alipay form not found in response.'); } } } catch (error) { console.error('支付寶支付發(fā)起失敗:', error); alert('支付失敗,請(qǐng)稍后重試!'); } }; </script>
2. 支付成功回調(diào)頁(yè)面 (PaymentSuccess.vue)
你需要一個(gè)專(zhuān)門(mén)的路由和頁(yè)面來(lái)接收支付寶的同步跳轉(zhuǎn)。
// 在 router/index.js 中配置路由 // { path: '/payment/success', name: 'PaymentSuccess', component: PaymentSuccess } // PaymentSuccess.vue <template> <div class="result-container"> <div v-if="loading">正在確認(rèn)支付結(jié)果...</div> <div v-else-if="paymentSuccess"> <h3>支付成功!</h3> <p>訂單號(hào):{{ orderId }}</p> </div> <div v-else> <h3>支付結(jié)果確認(rèn)失敗</h3> <p>請(qǐng)稍后到您的訂單中心查看最新?tīng)顟B(tài)。</p> </div> </div> </template> <script setup> import { ref, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import axios from 'axios'; const route = useRoute(); const loading = ref(true); const paymentSuccess = ref(false); const orderId = ref(''); onMounted(async () => { // 從支付寶同步跳轉(zhuǎn)的URL中獲取訂單號(hào) orderId.value = route.query.out_trade_no; if (orderId.value) { try { // 再次向自己的后端查詢(xún),獲取最準(zhǔn)確的支付狀態(tài) const response = await axios.get(`/api/payment/status?orderId=${orderId.value}`); if (response.data.status === 'SUCCESS') { paymentSuccess.value = true; } } catch (error) { console.error('確認(rèn)支付狀態(tài)失敗:', error); } finally { loading.value = false; } } else { loading.value = false; } }); </script>
總結(jié)與對(duì)比
特性 | 微信支付 (Native) | 支付寶支付 (電腦網(wǎng)站) |
---|---|---|
交互方式 | 內(nèi)嵌二維碼,不離開(kāi)當(dāng)前網(wǎng)站 | 跳轉(zhuǎn)到支付寶網(wǎng)站 |
前端核心任務(wù) | 1. 請(qǐng)求code_url 2. 生成二維碼 3. 輪詢(xún)支付狀態(tài) | 1. 請(qǐng)求form_html 2. 動(dòng)態(tài)創(chuàng)建并提交表單 |
結(jié)果確認(rèn) | 依賴(lài)前端輪詢(xún)獲取最終狀態(tài) | 依賴(lài)同步跳轉(zhuǎn)(return_url) + 最終狀態(tài)查詢(xún) |
用戶(hù)體驗(yàn) | 在當(dāng)前頁(yè)完成,體驗(yàn)更連貫 | 頁(yè)面跳轉(zhuǎn),體驗(yàn)有中斷感 |
問(wèn)題1:支付寶能不能像微信支付一樣也采用短輪詢(xún)的方式
完全可以! 支付寶同樣支持通過(guò)短輪詢(xún)的方式來(lái)處理支付結(jié)果,而且在某些場(chǎng)景下,這種方式的用戶(hù)體驗(yàn)會(huì)優(yōu)于頁(yè)面跳轉(zhuǎn)。
短輪詢(xún)的方式,對(duì)應(yīng)的是支付寶的 “當(dāng)面付” 產(chǎn)品中的 “掃碼支付” 功能。雖然它的名字叫“當(dāng)面付”,但它并非只能用于線(xiàn)下場(chǎng)景。線(xiàn)上PC網(wǎng)站完全可以使用它來(lái)實(shí)現(xiàn)和微信Native Pay(掃碼支付)一模一樣的用戶(hù)體驗(yàn)。
下面詳細(xì)講解如何使用支付寶的“掃碼支付”配合前端輪詢(xún)來(lái)實(shí)現(xiàn)PC端支付。
支付寶“掃碼支付”(當(dāng)面付)的工作流程
這個(gè)流程和我們之前討論的微信掃碼支付幾乎完全一致:
簽約產(chǎn)品:確保你的支付寶開(kāi)放平臺(tái)賬號(hào)已經(jīng)簽約了**“當(dāng)面付”** 產(chǎn)品。
創(chuàng)建訂單:用戶(hù)在你的網(wǎng)站上點(diǎn)擊“去支付”。
前端請(qǐng)求下單:前端調(diào)用后端的支付寶下單接口。這里與“電腦網(wǎng)站支付”的下單接口是不同的。例如
POST /api/payment/alipay-qrcode
。后端調(diào)用支付寶“統(tǒng)一收單交易預(yù)創(chuàng)建”接口:
- 后端不再是調(diào)用
alipay.trade.page.pay
(電腦網(wǎng)站支付接口)。 - 而是調(diào)用
alipay.trade.precreate
(掃碼支付的預(yù)創(chuàng)建接口)。 - 這個(gè)接口成功后,支付寶會(huì)返回一個(gè)二維碼鏈接 (qr_code),這個(gè)鏈接的內(nèi)容就是支付寶支付二維碼的信息。
- 后端不再是調(diào)用
后端返回二維碼鏈接給前端:后端將從支付寶獲取的
qr_code
字符串返回給前端。前端生成并展示二維碼:前端拿到這個(gè)
qr_code
字符串,使用二維碼生成庫(kù)(如qrcode.vue
)將其渲染成一個(gè)可供掃描的二維碼圖片,并展示在當(dāng)前頁(yè)面上。前端啟動(dòng)輪詢(xún):在二維碼顯示的同時(shí),前端啟動(dòng)一個(gè)定時(shí)器,每隔幾秒鐘就調(diào)用后端的“支付狀態(tài)查詢(xún)接口”(這個(gè)查詢(xún)接口可以和微信共用),主動(dòng)詢(xún)問(wèn)訂單的支付狀態(tài)。
用戶(hù)掃碼支付:用戶(hù)打開(kāi)手機(jī)支付寶App,使用“掃一掃”功能掃描網(wǎng)頁(yè)上的二維碼,并完成支付。
后端接收異步通知 (Notify URL):用戶(hù)支付成功后,支付寶服務(wù)器會(huì)向你后端配置的
notify_url
發(fā)送異步通知。后端接收到通知并驗(yàn)簽成功后,更新訂單狀態(tài)為“已支付”。前端輪詢(xún)得知成功:前端的輪詢(xún)請(qǐng)求最終會(huì)從后端那里得到“已支付”的狀態(tài)。此時(shí),前端停止輪詢(xún),并給用戶(hù)顯示支付成功的提示,然后跳轉(zhuǎn)到成功頁(yè)面或更新UI。
與“電腦網(wǎng)站支付”的核心區(qū)別
特性 | 支付寶“掃碼支付”(當(dāng)面付) | 支付寶“電腦網(wǎng)站支付” |
---|---|---|
后端調(diào)用接口 | alipay.trade.precreate | alipay.trade.page.pay |
后端返回值 | 二維碼鏈接字符串 (qr_code) | 一段可自動(dòng)提交的HTML Form表單 |
前端處理方式 | 內(nèi)嵌二維碼 + 前端輪詢(xún) | 新頁(yè)面跳轉(zhuǎn) |
用戶(hù)體驗(yàn) | 在當(dāng)前網(wǎng)站完成支付,不跳轉(zhuǎn),體驗(yàn)流暢 | 跳轉(zhuǎn)到支付寶網(wǎng)站,支付完成后再跳回,體驗(yàn)有中斷感 |
適用場(chǎng)景 | 需要在網(wǎng)頁(yè)內(nèi)完成支付的場(chǎng)景,用戶(hù)體驗(yàn)更佳 | 任何PC網(wǎng)站支付,實(shí)現(xiàn)簡(jiǎn)單,是傳統(tǒng)的PC支付方式 |
Vue 3 代碼實(shí)現(xiàn)(輪詢(xún)方式)
你會(huì)發(fā)現(xiàn),這段代碼和我們之前寫(xiě)的微信支付的代碼幾乎完全一樣,只是API地址和返回字段名可能不同。這正是輪詢(xún)方式的優(yōu)點(diǎn)之一:前端邏輯可以高度復(fù)用。
<template> <div class="payment-container"> <h2>選擇支付方式</h2> <div> <button @click="initiatePayment('wechat')">微信支付</button> <button @click="initiatePayment('alipay')">支付寶支付</button> </div> <!-- 統(tǒng)一的二維碼展示區(qū)域 --> <div v-if="qrcodeUrl" class="qrcode-section"> <h3>請(qǐng)使用{{ paymentMethod === 'wechat' ? '微信' : '支付寶' }}掃碼支付</h3> <qrcode-vue :value="qrcodeUrl" :size="200" level="H" /> <p>二維碼有效時(shí)間剩余 {{ countdown }} 秒</p> </div> </div> </template> <script setup> import { ref, onUnmounted } from 'vue'; import { useRoute } from 'vue-router'; import QrcodeVue from 'qrcode.vue'; import axios from 'axios'; const route = useRoute(); const orderId = route.query.orderId; const paymentMethod = ref(''); const qrcodeUrl = ref(''); const countdown = ref(300); let pollTimer = null; let countdownTimer = null; // 發(fā)起支付(根據(jù)選擇的支付方式) const initiatePayment = async (method) => { // 清理之前的狀態(tài) stopPolling(); qrcodeUrl.value = ''; paymentMethod.value = method; try { let apiUrl = ''; if (method === 'wechat') { apiUrl = '/api/payment/wechat-native'; } else if (method === 'alipay') { apiUrl = '/api/payment/alipay-qrcode'; // 調(diào)用支付寶掃碼支付的下單接口 } const response = await axios.post(apiUrl, { orderId }); // 根據(jù)不同接口返回的字段名獲取二維碼鏈接 qrcodeUrl.value = (method === 'wechat') ? response.data.code_url : response.data.qr_code; // 開(kāi)始輪詢(xún)和倒計(jì)時(shí) startPolling(); startCountdown(); } catch (error) { console.error(`${method}支付二維碼生成失敗:`, error); alert('支付二維碼生成失敗,請(qǐng)重試!'); } }; // 輪詢(xún)支付狀態(tài)(完全可復(fù)用) const checkPaymentStatus = async () => { try { const response = await axios.get(`/api/payment/status?orderId=${orderId}`); if (response.data.status === 'SUCCESS') { stopPolling(); alert('支付成功!'); // router.push(...); } } catch (error) { console.error('查詢(xún)支付狀態(tài)失敗:', error); } }; const startPolling = () => { pollTimer = setInterval(checkPaymentStatus, 3000); }; const startCountdown = () => { countdown.value = 300; // 重置倒計(jì)時(shí) countdownTimer = setInterval(() => { if (countdown.value > 0) { countdown.value--; } else { stopPolling(); qrcodeUrl.value = ''; // 清空二維碼 alert('二維碼已過(guò)期,請(qǐng)重新選擇支付方式'); } }, 1000); }; const stopPolling = () => { if (pollTimer) clearInterval(pollTimer); if (countdownTimer) clearInterval(countdownTimer); }; onUnmounted(() => { stopPolling(); }); </script>
總結(jié)
答案是肯定的。支付寶的“當(dāng)面付-掃碼支付”產(chǎn)品就是為了實(shí)現(xiàn)與微信Native Pay類(lèi)似的用戶(hù)體驗(yàn)而設(shè)計(jì)的。
選擇哪種支付寶支付方式?
- 追求最佳用戶(hù)體驗(yàn):選擇 “當(dāng)面付-掃碼支付” + 前端輪詢(xún)。用戶(hù)無(wú)需離開(kāi)你的網(wǎng)站,流程更順暢,是現(xiàn)代Web應(yīng)用的首選。
- 追求最簡(jiǎn)單的實(shí)現(xiàn):選擇 “電腦網(wǎng)站支付” + 頁(yè)面跳轉(zhuǎn)。前端邏輯極其簡(jiǎn)單(拿到HTML字符串并提交),但用戶(hù)體驗(yàn)稍差。
對(duì)于一個(gè)同時(shí)需要支持微信和支付寶掃碼支付的PC網(wǎng)站,采用輪詢(xún)方案可以讓你的前端代碼邏輯高度統(tǒng)一,維護(hù)起來(lái)更加方便。
到此這篇關(guān)于Vue3實(shí)現(xiàn)微信支付寶PC端支付的文章就介紹到這了,更多相關(guān)Vue3微信支付寶PC端支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue兩個(gè)通信方式與動(dòng)畫(huà)過(guò)度及混入使用介紹
最近在寫(xiě)vue的一個(gè)項(xiàng)目要實(shí)現(xiàn)過(guò)渡的效果,雖然vue動(dòng)畫(huà)不是強(qiáng)項(xiàng),庫(kù)也多,但是基本的坑還是得踩扎實(shí),下面這篇文章主要給大家介紹了關(guān)于Vue中實(shí)現(xiàn)過(guò)渡動(dòng)畫(huà)效果的相關(guān)資料,需要的朋友可以參考下2023-03-03VUE項(xiàng)目運(yùn)行npm install報(bào)錯(cuò)問(wèn)題以及解決
在運(yùn)行Vue項(xiàng)目時(shí)遇到npm安裝錯(cuò)誤可使用命令npminstall--legacy-peer-deps解決,若VsCode中無(wú)法運(yùn)行npm命令,則可能是IDE配置未生效,可嘗試重啟電腦或使用cmd命令行直接在項(xiàng)目目錄下運(yùn)行2024-10-10Vue.js 2.0 和 React、Augular等其他前端框架大比拼
這篇文章主要介紹了Vue.js 2.0 和 React、Augular等其他前端框架大比拼的相關(guān)資料,React 和 Vue 有許多相似之處,本文給大家提到,需要的朋友可以參考下2016-10-10vue使用luckyexcel實(shí)現(xiàn)在線(xiàn)表格及導(dǎo)出導(dǎo)入方式
這篇文章主要介紹了vue使用luckyexcel實(shí)現(xiàn)在線(xiàn)表格及導(dǎo)出導(dǎo)入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05vue?element-plus圖片預(yù)覽實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue?element-plus圖片預(yù)覽實(shí)現(xiàn)的相關(guān)資料,最近的項(xiàng)目中有圖片預(yù)覽的場(chǎng)景,也是踩了一些坑,在這里總結(jié)一下,需要的朋友可以參考下2023-07-07elementui的table根據(jù)是否符合需求合并列的實(shí)現(xiàn)代碼
這篇文章主要介紹了elementui的table根據(jù)是否符合需求合并列的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03淺談vue websocket nodeJS 進(jìn)行實(shí)時(shí)通信踩到的坑
這篇文章主要介紹了淺談vue websocket nodeJS 進(jìn)行實(shí)時(shí)通信踩到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09vue中axios的封裝問(wèn)題(簡(jiǎn)易版攔截,get,post)
這篇文章主要介紹了vue中axios的封裝問(wèn)題(簡(jiǎn)易版攔截,get,post),需要的朋友可以參考下2018-06-06