【问题标题】:How to trigger a click event once a page or view is loaded in vue.js?在 vue.js 中加载页面或视图后如何触发点击事件?
【发布时间】:2020-12-24 15:54:36
【问题描述】:

一旦加载页面或视图,就会触发点击,并在vue.js 中触发popup 以编辑数据表行。我找不到这么好的VUE方式,虽然下面的链接提到了一种方式如下:

https://forum.vuejs.org/t/how-to-trigger-a-click-event-through-code-in-vuejs-on-page-load/92582

mounted: function () {
    setTimeout(function(){ 
        const elem = document.getElementById('myBtn');
            elem.click(); 
    }, 100);
},

我以类似的方式进行了以下操作。 try catch 包含错误,尽管它很丑陋,因为在某些时候数据不存在。

edit: function (idx, row) {
    ... nore code here ...
    try {
        document.getElementById(row.id).click();  // row.id is dynamic or variable
    } catch (error) {
        // pass
    }
},

但是我的队友,一个 vue.js 爱好者,说这不是该死的 VUE 方式。现在做这种事情的正确方法是什么?

以下 Demo 可用于预期工作:

Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue({
el: '#app',

data: {
  li_address: [{name: 'CA'}, {name: 'NY'}, {name: 'AL'}],
  name: 'NY'
},

methods: {
},
mounted() {
  console.log(['this.name', this.name]);

  // this.$refs[this.name].click(); // failed
  document.getElementById(this.name).click();  // worked. the click is triggered upon this.name
}
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.27.5/css/uikit.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.27.5/js/uikit.min.js"></script>

<div id="app" class="container">

<div class="uk-grid" uk-grid>
<div v-for="r in li_address">
    <label>{{r.name}}
    <input :id="r.name" :ref="r.name" type="radio" class="uk-radio" :value="r"
     name="address_group">
    </label>
</div>

  </div>

</div>

【问题讨论】:

  • 为什么不直接调用click handler方法呢?
  • @Dan 是弹窗,必须在弹窗加载后点击。我不确定我是否理解你提到的方式。
  • 弹出窗口是您应用的一部分吗?如果是这样,您应该显示该组件以便更容易解释
  • 其实就是一个数据表,弹窗就是编辑一行。单击编辑按钮后,弹出窗口将填充数据行。弹窗加载后,需要点击一下。
  • 您需要在问题中显示所有相关的组件模板+代码,而不是描述它

标签: javascript vue.js vuejs2


【解决方案1】:

为您的元素添加一个名为 myBtn 的引用,例如:

  <div ref="myBtn" >some content</div>

然后运行点击:

 this.$refs.myBtn.click()

示例:

Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue({
  el: '#app',


  methods: {
    logOk() {
      console.log("OK OK")
    }

  },
  mounted() {
    this.$refs.okBtn.click()

  }
})
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>


<div id="app" class="container">

  <button ref="okBtn" @click="logOk"> OK</button>
</div>

【讨论】:

  • this.$refs 恕我直言,有点丑陋。感谢分享解决方案。
  • 不丑,是Vue操作DOM的方式vuejs.org/v2/guide/…
  • 如果ref="data_row.id",而data_row.idokBtn是动态变量,有没有办法通过this.$refs调用click()?谢谢
  • 是的,你可以,使用:ref="data_row.id"this.$refs[data_row.id].click()
  • :ref="data_row.id"ref="data_row.id" 如果在标签 &lt;input 中则消失
【解决方案2】:

在您的示例代码中,不需要任何 DOM 操作。像 Vue 这样的声明式响应式框架的主要优势在于模型的更改会自动传播到视图。这将通过适当地设置v-model 来选择适当的单选按钮。

new Vue({
  el: '#app',
  data() {
    return {
      li_address: [{name: 'CA'}, {name: 'NY'}, {name: 'AL'}],
      name: 'NY'
    }
  }
})
<div id="app" class="container">
  <div class="uk-grid" uk-grid>
    <div v-for="r in li_address">
      <label :for="r.name">{{r.name}}
      <input type="radio" v-model="name" :id="r.name" :value="r.name">
      </label>
    </div>
    <h4>NAME: {{ name }}</h4> 
  </div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.27.5/css/uikit.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.27.5/js/uikit.min.js"></script>

【讨论】:

    【解决方案3】:

    只需选择您的元素并在 Vue 应用程序的 Mounted 生命周期上触发 Click 事件

    mounted() {
     this.$nextTick(() => {
       document.getElementById('myBtn').click()
     });      
    }
    

    $nextTick 根据 VueJs 文档:

    将回调推迟到下一个 DOM 更新周期后执行。采用 在您更改一些数据以等待 DOM 之后立即执行此操作 更新。

    【讨论】:

    • document.getElementById('myBtn').click() 在问题中被提及。这看起来不是一种 Vue 方式。 Vanilla JavaScript 运行良好。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多