• Vue.extend()实现每个页面弹框


    官网照明:API — Vue.js

    使用场景:使用基础 Vue 构造器,创建一个“子类”。当项目中想要每个页面或者特定的多个页面弹出、出现xxx内容时,可以使用Vue.extend()实现。

    • 场景1:只要登录后才能实现收藏,想在所有涉及到收藏的页面判断是否登录,没有登录的在点击收藏时弹出登录框。
    • 场景2:给每个页面增加一个回到首页的悬浮按钮。

    代码实现: 

    •   先建一个LoginModal.vue文件将弹框内容实现;
    1. <template>
    2. <view class="login-dialog">
    3. <uni-popup class="login-popup" ref="inputDialog">
    4. <view class="login-title">手机号登录view>
    5. <uni-forms ref="valiForm" :rules="rules" :modelValue="valiFormData">
    6. <uni-forms-item name="mobilePhone">
    7. <uni-easyinput trim="all" type="tel" v-model="valiFormData.name" focus placeholder="请输入手机号" />
    8. uni-forms-item>
    9. <uni-forms-item name="validateCode">
    10. <view class="form-item">
    11. <uni-easyinput trim="all" v-model="valiFormData.age" placeholder="请输入6位验证码" />
    12. <button class="form-item-code" type="primary" size="mini" plain="true" @click="getCode()" :disabled="isCodeDisabled">
    13. {{ !isCodeDisabled ? '获取验证码' : count + 's' + '重新获取' }}
    14. button>
    15. view>
    16. uni-forms-item>
    17. uni-forms>
    18. <button @click="handleSubmit('valiForm')">登录button>
    19. uni-popup>
    20. view>
    21. template>
    22. <script>
    23. export default {
    24. data() {
    25. return {
    26. isCheck: '',
    27. valiFormData: {
    28. mobilePhone: '',
    29. validateCode: '',
    30. },
    31. count: 60,
    32. timer: null,
    33. isCodeDisabled: false,
    34. userId: '',
    35. // 校验规则
    36. rules: {
    37. mobilePhone: {
    38. rules: [
    39. {
    40. required: true,
    41. errorMessage: '手机号码不能为空',
    42. },
    43. {
    44. pattern: /^[1]([3-9])[0-9]{9}$/,
    45. errorMessage: '手机号不合法!',
    46. },
    47. ],
    48. },
    49. validateCode: {
    50. rules: [
    51. {
    52. required: true,
    53. errorMessage: '验证码不能为空',
    54. },
    55. {
    56. format: 'number',
    57. maxLength: 6,
    58. errorMessage: '验证码只能输入6个数字',
    59. },
    60. ],
    61. },
    62. },
    63. };
    64. },
    65. methods: {
    66. handleOpen() {
    67. this.$refs.inputDialog.open('bottom');
    68. },
    69. close() {
    70. this.$refs.inputDialog.close();
    71. },
    72. //获取短信验证码
    73. getCode() {
    74. this.$refs.valiForm
    75. .validateField(['mobilePhone'])
    76. .then(res => {
    77. if (!this.timer) {
    78. // 验证码接口
    79. this.$api.getPhoneCode({ mobilePhone: res.mobilePhone }).then(res => {
    80. if (res.result == 1) {
    81. this.$msg.success('手机短信已发送!');
    82. } else {
    83. this.$msg.error('服务器错误!');
    84. }
    85. });
    86. this.isCodeDisabled = true;
    87. this.timer = setInterval(() => {
    88. if (this.count > 0 && this.count <= 60) {
    89. this.count--;
    90. } else {
    91. this.isCodeDisabled = false;
    92. clearInterval(this.timer);
    93. this.timer = null;
    94. this.count = 60;
    95. }
    96. }, 1000);
    97. }
    98. })
    99. .catch(err => {
    100. console.log(err);
    101. });
    102. },
    103. handleSubmit(ref) {
    104. this.$refs[ref]
    105. .validate()
    106. .then(res => {
    107. // 登录接口
    108. this.$api
    109. .login({
    110. mobilePhone: res.mobilePhone,
    111. validateCode: res.validateCode,
    112. })
    113. .then(res => {
    114. if (res && res.ID_) {
    115. this.$msg.success('登录成功!');
    116. this.$refs.inputDialog.close();
    117. location.reload();
    118. } else {
    119. this.$msg.error(res.message);
    120. this.userId = '';
    121. res.validateCode = '';
    122. }
    123. });
    124. })
    125. .catch(err => {
    126. console.log('err', err);
    127. });
    128. },
    129. },
    130. };
    131. script>
    • 创建一个LoginModal.js文件来将实例构造器挂载在页面上;
    1. import Vue from "vue";
    2. import Login from '@/pages/LoginModal.vue';
    3. // 1.使用基础 Vue 构造器,创建一个“子类”;
    4. const LoginModal = Vue.extend(Login);
    5. const LoginModalBox = (options = {}) => {
    6. // 2.创建 LoginModal 实例;
    7. let instance = new LoginModal(); //无传参
    8. // let instance = new LoginModal({
    9. // data: {
    10. // ...options, //有传参
    11. // },
    12. // });
    13. // 3.实例构造器需要进行挂载到页面中;
    14. instance.$mount();
    15. // 4.通过$el属性来访问创建的组件实例;
    16. document.body.appendChild(instance.$el);
    17. console.log(instance, 'instance');
    18. return instance;
    19. };
    20. // 5.两种方式将逻辑函数进行暴露,并且在mian.js引入挂载到全局;
    21. // 5-1.Vue.prototype直接暴露;
    22. export default LoginModalBox;
    23. // 5-2. vue.use()的install()暴露对象;
    24. export default {
    25. install: (Vue) => {
    26. Vue.prototype.$loginModal = LoginModalBox;
    27. },
    28. };

    •  在mian.js引入挂载到全局;
    1. 如果是使用的5-1的方式直接暴露,则在main.js中直接写:Vue.prototype.$loginModal = LoginModalBox;
    2. 如果是使用的5-2的install()方法来暴露一个对象,则在main.js中直接写:Vue.use(LoginModalBox);
    1. import Vue from 'vue';
    2. import store from './store/index'
    3. import App from './App.vue';
    4. import router from './router';
    5. import LoginModalBox from '@/core/LoginModal.js'
    6. Vue.config.productionTip = false;
    7. // 方法一:在原型上定义,使其在每个Vue中的实例中可用;
    8. Vue.prototype.$loginModal = LoginModalBox;
    9. // 方法二:使用Vue.use
    10. // Vue.use(LoginModalBox);
    11. new Vue({
    12. router,
    13. store,
    14. render: h => h(App),
    15. }).$mount('#app')
    • 使用创建的‘子类’;
    1. handleLogin() {
    2. // 直接调用loginModal页面的方法
    3. this.$loginModal().handleOpen();
    4. },

    知识点:Vue.use 与 Vue.prototype 的区别

    1. Vue.prototype是在原型上定义,使其在每个Vue中的实例中可用。
    2. Vue.use()方法的核心就是Vue.prototype,只不过又封装了一层,执行install 方法,更加的灵活,扩展性更好。
    3. 两者没有本质区别。Vue.prototype适合于注册Vue生态外的插件,Vue.use适合于注册Vue生态内的插件。
  • 相关阅读:
    Java 第二阶段提升编程能力【泛型】
    前端开发——HTML5新增加的表单属性
    【MySql】MySql表的增删查改
    分布式文件系统fastDFS
    【前端】Layui动态数据表格拖动排序
    前端经典面试题 | 性能优化之图片优化
    拒绝内卷:利用4P营销理论打造汇报PPT
    查询数据库DQL
    Thymeleaf模板
    如果我有一台服务器的话
  • 原文地址:https://blog.csdn.net/weixin_47978760/article/details/126579516