【问题标题】:Conditional v-if is working only for the first time?条件 v-if 仅第一次起作用?
【发布时间】:2017-05-26 08:39:54
【问题描述】:

我认为这是:

<div class="already_voted" v-if="already_voted" >
    <p>You already voted or your are not allowed to vote</p>
  </div>

这是我的方法:

 upvote: function(com_id) {

              var comment_id = {
                comment_id :com_id
              }
              this.$http.post('/blog/article/comment/upvote', comment_id).then(function(response){
                upvote_total= response.data.upvote_value;
                  this.already_voted = response.data.already_voted;
                  this.$dispatch('child-msg', this.already_voted);
                $('.upvote_class_' + com_id ).text(upvote_total);
                $('.isDisabledUpvote_' + com_id).addClass('disabled');
                 $('.isDisabledDownvote_' + com_id).removeClass('disabled');
              },function(response){

              });

          },

我在点击时获得了价值,如果它是真的,它需要显示这个 div。 问题是这个 div 仅在 already_voted 为真时才第一次显示,仅此而已。下次当它真的什么都没发生时。有什么建议吗?

【问题讨论】:

  • 尝试在http请求之前创建一个变量来存储vue this (var self = this) 然后使用self.already_voted
  • 好的,我现在试试
  • 我在 http 请求之前创建变量时遇到同样的问题

标签: laravel laravel-5 laravel-5.2 vue.js


【解决方案1】:

您似乎在混合使用 jQueryVue,除非您有特定的理由,否则应避免这样做。相反,您应该将属性绑定到数据。作为您所做工作的基本版本,您可以将 disabled 属性和消息绑定到 voted 标志:

标记

<div id="app">
  <div v-if="voted">
    You have already voted!
  </div>
  <button v-bind:disabled="voted" @click="vote()">
  Vote
  </button>
    <button v-bind:disabled="!voted" @click="removeVote()">
  Un-Vote
  </button>
</div>

查看模型

new Vue({
  el: '#app',
  methods: {
    vote(){
      this.voted = true;
    },
    removeVote(){
      this.voted = false;
    }
  },
  data: {
    voted: false
  }
});

在这里,我只是使用v-binddisabled 属性绑定到voted 标志以禁用按钮,并使用v-ifvoted 标志为真时显示消息。

这是 JSFiddle:https://jsfiddle.net/05sbjqLL/

还要注意,匿名函数内部的this 指的是匿名函数本身,因此要么将this 分配给函数外部的某个东西(var self = this),要么使用arrow function,如果使用ES6

编辑

我已经更新了 JSFiddle 以向您展示如何根据您的 cmets 处理您的情况:

https://jsfiddle.net/umkvps5g/

首先,我创建了一个 directive,它允许您从 cookie 启动变量:

Vue.directive('init', {
  bind: function(el, binding, vnode) {
    vnode.context[binding.arg] = binding.value;
  }
})

现在可以用作:

<div v-init:voted="{{ $request->cookie('voted') }}"></div>

我只是 disabled 按钮向您展示如何将属性绑定到数据,还有更多可以做的事情,例如在用户单击按钮后显示消息,我刚刚添加了一个点击计数器并绑定v-if 改为那个,所以在用户单击按钮之前不会显示消息:

<div v-if="vote_attempts">
  You have already voted!
</div>

然后在vote()方法中:

vote() {
    this.voted = true;
    this.vote_attempts++;
  },

然后是数据:

  data: {
    voted: false,
    vote_attempts: 0
  }

【讨论】:

  • 我使用cookie来检查用户是否投票,如果我使用v-bind,那么当他刷新页面时他会再次投票。
  • 我所拥有的是在他点击按钮投票时显示消息,而不是禁用它
  • 还有一件事......我如何在 n 秒后隐藏该消息,然后如果用户再次点击投票以显示它??
  • 我感觉你会问这个问题,你可以简单地使用超时将 vote_attempts 设置回 0,如果你不介意的话,你可以只用一个布尔标志来代替关于尝试次数,这里是更新的小提琴:jsfiddle.net/umkvps5g/1
  • 就是这样...tnx 很多:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2012-04-12
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多