Компонент Vue создается заново после созданного метода

#javascript #vue.js #vuejs2 #vue-component

Вопрос:

Я пытаюсь рассчитать поля изображения, чтобы показать его в центре страницы при создании диалогового окна изображения. Я вычисляю маржу в созданном методе компонента, и когда я отлаживаю, я вижу, что она расположена правильно после моего метода набора маржи jquery. Но когда я продолжил отладку, компонент каким-то образом перенаправляется без перехода в созданный метод, и поле изображения не устанавливается. Я постоянно сталкивался с такой ситуацией, когда пытался установить какую-либо переменную в созданном методе, и она всегда повторялась, не заходя в созданный блок. Есть ли какой-нибудь способ предотвратить это? Это действительно раздражает.

Вот мой созданный блок :

 async created() {
    let self = this;

    $('.vodal.image-dialog').css('cursor', 'wait');

    $('.vodal.image-dialog').css('cursor', 'default');
    var margin = $(window).width() / 2 - $(".vodal.image-dialog .pop-up img").width() / 2;
    $(".vodal.image-dialog img").css('margin-left', margin);
    $(".vodal.image-dialog .pop-up img").show();

  },
 

Обновить :

Я решил эту проблему, просто указав атрибут margin с помощью v-bind:style и получив его из вычисляемого свойства, подобного этому :

 <img v-if="isEntitySaved()" v-bind:style="{'margin-left': margin   'px'}"
      v-bind:src="image" class="blurred"/>
...
computed: {
    margin: function() {
      var imgClass = ''
      if(this.source == 'detail-main')
        imgClass = ".vodal.image-dialog .pop-up .main-image img"
      else
        imgClass = ".vodal.image-dialog .pop-up .side-image img"

      return $(window).width() / 2 - $(".vodal.image-dialog .pop-up ."   this.source   " img").width() / 2
    }
  }
 

Но проблема сохраняется, в другом компоненте у меня изначально был стиль шаблона «отображение: нет». После нажатия какой-либо кнопки я хочу показать ее, поэтому я установил для нее стиль «отображать: блок» в созданных и обновленных методах, но снова она отображается после метода $.show в и созданного блока, но компоненты перенаправляются и исчезают, не заходя в созданный или обновленный блок. Как я могу решить эту проблему?

Комментарии:

1. Ооо, почему в вашем приложении Vue есть jQuery?

Ответ №1:

created крючок вызывается только один раз, вам нужно использовать updated крючок.

 export default {
  created() {
    this.updateStyle();
  },
  updated() {
    this.updateStyle();
  },
  methods: {
    updateStyle() {
      let self = this;

      $(".vodal.image-dialog").css("cursor", "wait");

      $(".vodal.image-dialog").css("cursor", "default");
      var margin =
        $(window).width() / 2 -
        $(".vodal.image-dialog .pop-up img").width() / 2;
      $(".vodal.image-dialog img").css("margin-left", margin);
      $(".vodal.image-dialog .pop-up img").show();
    },
  },
};
 

Обновить

Потому что вы используете слишком много jQuery в приложении Vue.

Самый быстрый способ решить вашу проблему-просто принудительно выполнить повторный рендеринг, как это

 export default {
  data() {
    return {
      count: 0,
    };
  },
  updated() {
    // updated will guarantee to be called if you modify this.count
  },
  methods: {
    doSomething() {
      // do what ever you want
      // .......
      // At the end, make sure to call this
      this.count  ;
    },
  },
};

 

Комментарии:

1. Я обновил вопрос, вы можете проверить?

2. Я обновил ответ.