Vue中解决js获取不到未初始化的控件对象的方法

Vue中解决js获取不到未初始化的控件对象的方法

问题描述

  • 在使用Vue发编写页面时,并不是所有的页面中的控件在初始化的时候都会进行加载
  • 这个时候,当js中调用该控件的事件时,就会无法找到该控件导致调用是事件的失败

问题原因

  • 当页面初始化时,该页面默认显示的控件都会进行加载
  • 但是有一些页面中的控件如dialog,页面初始化时,它大部分情况下是隐藏的,所以依附在它上面的控件并不是一开始就加载的
  • 当这些控件显示出来的时候,调用其方法时,会存在找不到相应的对象的情况,从而导致调用相关方法的失败

解决办法

//调用方法内部中
setTimeout(() => {
    //判断控件对象是否存在
        //初始化页面未初始化的控件对象
}, 0);

实例

  • 控件
    <el-dialog
      :title="控件延迟加载"
      :visible.sync="addFaceDialogVisible">
      <el-button type="primary" id="add_pic_btn">添加</el-button>
    </el-dialog>
    
  • 数据
    addFaceDialogVisible:false,
    plUploader:null,
    add_face_pic:nukk,
    add_face_pic_key:null,
    
  • 事件
    initUpload: function () {
        let self = this;
        this.add_face_pic = null;
        this.add_face_pic_key = null;
        let randomStr = Math.random().toString(36).substr(2);
        this.plUploader = new plupload.Uploader({
          runtimes: 'html5,flash,silverlight,html4',
          url: '/upload?session_id=' + randomStr,
          browse_button: 'add_pic_btn',
          multi_selection: false,
          max_file_size: '10mb',
          chunk_size: '1mb',
          filters: {
            mime_types: [
              {
                title: 'Image files',
                extensions: 'jpg,gif,png,bmp'
              }
            ],
          },
          init: {
            FilesAdded: function (up, files) {
              up.start()
            },
            FileUploaded: function (up, file, info) {
              let obj = JSON.parse(info.response);
              let key = obj.model.name;
              self.add_face_pic_key = key;
              self.add_face_pic = '/image?image=' + key;
            },
          }
        });
        this.plUploader.init();
      },
    
  • 在上述实例中,存在问题
    • 当dialog创建时,单击按钮(add_pic_btn)时,并不会进行图片上传的操作,没有任何的反馈
  • 解决办法
    1. 页面初始化的时候在挂载方法中进行初始化dialog,然后在进行隐藏,之后调用时判断plUploader对象是否存在,存在时不创建 -- 弊端:整个页面初始化时控件加载会闪一下,体验不友好
    2. 在dialog弹出时,setTimeout加载控件
      if (this.plUploader == null) {
        setTimeout(() => {
          this.initUpload();
        }, 0);
      }
      

可能会出现的问题

  • 当在同一页面多次调用控件的方法时,会出现连续弹出框的时候,应该是控件连续被创建,注意控件是否为null的判断,当控件不为null再进行创建,否则直接用已经存在的对象
Vue.js中,当你想要在路由器初始化完成后显示某个Vue组件时,通常会结合路由守卫(Route Guards)和组件注册来实现。这里是一个简化的步骤说明: 1. **设置路由配置**: 在`router/index.js`文件中,创建一个新的路径并关联一个组件,例如: ```javascript import YourComponent from '@/components/YourComponent.vue'; export default new VueRouter({ routes: [ // 其他路由... { path: '/your-path', component: YourComponent, name: 'YourComponentRoute', // 可选,用于导航链接 }, ], }); ``` 2. **使用路由守卫**: - 使用`beforeEach`守卫可以在每次导航尝试前运行代码。在这里可以加载数据或验证权限,然后跳转到目标组件: ```javascript router.beforeEach((to, from, next) => { if (to.path === '/your-path') { // 如果是你要显示的页面 // 这里你可以做初始化操作,比如从服务器获取数据并填充到组件中 axios.get('api/your-data').then(response => { const data = response.data; next({ name: 'YourComponentRoute', params: { data } }); // 跳转并传递数据 }).catch(error => { console.error('Failed to fetch data:', error); next(); // 或者直接跳转,不做任何处理 }); } else { next(); // 如果不是该路径,正常继续导航 } }); ``` 3. **组件内部接收数据**: 在`YourComponent.vue`中,通过`props`接收传入的数据: ```html <template> <div> <h1>{{ yourData.title }}</h1> <!-- 根据你的数据结构展示内容 --> <p v-for="item in yourData.items" :key="item.id">{{ item.description }}</p> </div> </template> <script> export default { props: { yourData: { type: Object, required: true, }, }, }; </script> ``` 完成上述步骤后,当用户访问`/your-path`时,组件会在数据准备好后渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风御浪云帆之上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值