Artikel ini akan membimbing anda langkah demi langkah dalam membangunkan vue komponen butang pemuatan yang sangat praktikal-Button Pemuat Saya harap ia akan membantu semua orang.
Dalam kerja harian, kita sering menghadapi adegan:
Minta beberapa data antara muka apabila mengklik butang Untuk mengelakkan klik berulang oleh pengguna, kami biasanya menambah pemuatan pada butang ini. Fungsi menambah loading
itu sendiri adalah sangat mudah, selagi kita mentakrifkan pembolehubah dan menggunakannya dalam komponen Button
Walau bagaimanapun, apabila melakukan projek pengurusan latar belakang, mungkin terdapat banyak, banyak butang sedemikian, mungkin satu komponen , banyak pembolehubah adalah xxx_loading
, yang memakan masa, intensif buruh dan tidak cukup elegan.
Seterusnya, kami membuat enkapsulasi ringkas bagi komponen Button
untuk menyelesaikan masalah loading
yang memakan masa dan tidak elegan ini. (Belajar perkongsian video: tutorial video vue)
Kami menggunakan Antd
Modal
kotak dialog, apabilaonOk
kami ialah异步函数
, butang OKModal
akan menambah kesanloading
secara automatik dan menutup tetingkap pop timbul selepas pelaksanaan fungsi selesai, seperti ini:
Pada masa ini, kodnya adalah seperti berikut:
asyncFunc() { return new Promise(resolve => { setTimeout(() => { resolve() }, 2000) }) }, handleTestModal() { const that = this this.$confirm({ title: '测试异步函数', content: '异步函数延迟两秒结束', async onOk() { await that.asyncFunc() } }) },
Selepas melihat kesan ini, saya fikir jika saya boleh merangkumkan
Button
Komponen, masukkan fungsi yang perlu dilaksanakan, bukankah sangat mudah untuk menambah kesanloading
secara automatik dalam komponen mengikut pelaksanaan fungsi.
Tentukan parameter komponen
Hanya tentukan beberapa di sini Biasa parameter yang digunakan: text(按钮文字)
, type(按钮类型)
, asyncFunc(按钮点击时执行的异步函数)
, delay(loading延迟)
Selain itu, pembolehubah loading
di dalam komponen diperlukan untuk mengawal status komponen Button
kami adalah seperti berikut:
export default { data() { return { loading: false } }, props: { text: { type: String, default: '确定' }, type: { type: String, default: 'primary' }, delay: { type: Number, default: 0 }, asyncFunc: { type: Function, default: () => {} } }, }
Gunakan <span style="font-size: 18px;">antd</span>
antd<span style="font-size: 18px;">Button</span>
LoadingButton
click
Dalam komponen
<template> <Button :type="type" :loading="loading" @click="handleClick"> {{ text }} </Button> </template> <script> import { Button } from 'ant-design-vue' export default { components: { Button }, methods: { handleClick() {} } } </script>
<span style="font-size: 18px;">asyncFunc</span>
Hakim fungsi tak segerak</p>asyncFunc<blockquote>
asyncFunc
yang kita lalui adalah fungsi tak segerak, komponen perlu menambah animasi pemuatan, maka kita? harus Bagaimana untuk menentukan sama ada fungsi adalah fungsi tak segerak? antd
Bagaimanakah ia dilaksanakan? antd
Modal
antd
Kami baru sahaja memperkenalkan bahawa terdapat logik yang serupa dalam
// components/modal/ActionButton.jsx onClick() { const { actionFn, closeModal } = this; if (actionFn) { let ret; if (actionFn.length) { ret = actionFn(closeModal); } else { ret = actionFn(); if (!ret) { closeModal(); } } if (ret && ret.then) { this.setState({ loading: true }); ret.then( (...args) => { // It's unnecessary to set loading=false, for the Modal will be unmounted after close. // this.setState({ loading: false }); closeModal(...args); }, e => { // Emit error when catch promise reject // eslint-disable-next-line no-console console.error(e); // See: https://github.com/ant-design/ant-design/issues/6183 this.setState({ loading: false }); }, ); } } else { closeModal(); } },
dilaksanakan: antd
.then
ret && ret.then
Baca pelaksanaan
async handleClick() { const asyncFunc = this.asyncFunc if (!this.isFunc) { return } const ret = asyncFunc() // 如果是异步函数,则显示loading if (ret && ret.then) { this.loading = { delay: this.delay } ret.finally(() => { this.loading = false }) } }
) kaedah, maka kita boleh melakukan sesuatu yang serupa Penghakiman, kodnya adalah seperti berikut: LoadingButton
KomponenPada ketika ini kami logik komponen teras telah dibangunkan, dan kemudian Mari kita tulis demo untuk menguji sama ada komponen
LoadingButton
<template> <div> <LoadingButton :delay="500" :asyncFunc="asyncFunc" /> </div> </template> <script> import LoadingButton from './LoadingButton.vue' export default { data() { return { loading: false } }, components: { LoadingButton }, methods: { asyncFunc() { return new Promise(resolve => { setTimeout(() => { resolve() }, 2000) }) } } } </script>
asyncFunc
Kami menulis fungsi tak segerak untuk mensimulasikan permintaan tak segerak dalam perniagaan sebenar , kini anda boleh melihat kesannya:
loading
LoadingButton
loading
adalah sejajar dengan kesan yang dijangkakan sebelum ini, supaya apabila kita mempunyai senario serupa yang memerlukan
这个组件其实核心的代码非常少,也很容易读懂。由于最近在做一些业务这类场景比较多,感觉这个小组件还是挺实用的所以分享给大家,这里也是只对最重要的部分做了一个介绍,相信大家学会了之后也可以通过这个方式封装出符合自己实际场景需求的组件。最后,附上这个组件的完整代码:
<template> <Button :type="type" :loading="loading" @click="handleClick"> {{ text }} </Button> </template> <script> import { Button } from 'ant-design-vue' export default { data() { return { loading: false } }, props: { text: { type: String, default: '确定' }, type: { type: String, default: 'primary' }, delay: { type: Number, default: 0 }, asyncFunc: { type: Function, default: () => {} } }, components: { Button }, computed: { isFunc() { return typeof this.asyncFunc === 'function' } }, methods: { async handleClick() { const asyncFunc = this.asyncFunc if (!this.isFunc) { return } const ret = asyncFunc() // 如果是异步函数,则显示loading if (ret && ret.then) { this.loading = { delay: this.delay } ret.finally(() => { this.loading = false }) } } } } </script>
原文地址:https://juejin.cn/post/7099234795720278046
作者:liangyue
Atas ialah kandungan terperinci Amalan komponen Vue: Bangunkan komponen Butang pemuatan--Button Pemuatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!