Vue.js를 다시로드 / 렌더링 할 수 있습니까?


231

간단한 질문입니다.

당신은 강제 Vue.js다시로드 / 새로 고침 모든? 그렇다면 어떻게?


더 나은 지원 여기서 얻을 수 있습니다 github.com/vuejs/Discussion/issues을
코리 다니엘에게

그 토론 장소에 대해 몰랐습니다. 저기 시도하겠습니다.
Dave

결국 응답을 받았습니까? 나도 알고 싶어
Oddman

정확히 기억하지 마십시오. 그러나 여기에 몇 가지 단서로 열린 문제가 있습니다. github.com/vuejs/Discussion/issues/356
Dave

뷰에 v-for 지시문이 있고 해당 배열에서 두 객체를 수동으로 바꿀 때 유스 케이스가 있습니다. Vue는 이후에 템플릿을 자동으로 다시 렌더링하지 않습니다. 해결 방법을 사용했습니다.이 배열로 모든 작업을 수행하십시오 (빈 개체를 푸시 한 다음 스플 라이스를 수행하십시오)-이것은 렌더링을 트리거합니다. 그러나 이것은 특별한 경우입니다.
Fyodor Khruschov

답변:


237

이 마법 주문을보십시오 :

vm.$forceUpdate();

교수형 변수를 만들 필요가 없습니다. :)

업데이트 : VueJS로 작업하기 시작했을 때이 솔루션을 찾았습니다. 그러나 추가 조사를 통해 이러한 접근 방식을 목발로 입증했습니다. 내가 기억하는 한, 나는 그것을 자동으로 새로 고치지 못한 모든 속성 (대부분 중첩 된 속성)을 계산 된 속성에 넣는 것을 제거했습니다.

자세한 정보는 여기 : https://vuejs.org/v2/guide/computed.html


4
이것은 Vue의 양식 마법사 구성 요소와 함께 사용할 때 실제로 도움이되었습니다. 데이터 변수가 그대로인데 양식 필드 필드가 없어졌습니다. 이제 돌아가서 뷰를 새로 고치기 위해 이것을 사용하고 있으며 setTimeout 함수에 배치해야했습니다.
Jimmy Ilenloa

26
vue 파일에는 'this. $ forceUpdate ();'가 필요합니다.
Katinka Hesselink 2019 년

1
이것은 긴 액시오 호출 후 업데이트에 효과적입니다.
AlfredBr

4
절대적으로 이상한 방식 $forceUpdate()으로 2.5.17에서 결코 나를 위해 일한 적이 없습니다.
Abana Clara

2
@AbanaClara $ forceUpdate ()는 공개 메소드가 아니 었습니다 .Vue의 소스 코드를 파는 것을 발견했습니다. 그리고 그것이 Vue'ing의 올바른 방법이 아니었기 때문에 아마도 제거 될 수 있습니다. 나는 더 이상 프론트 엔드를하지 않기 때문에 그것이 여전히 존재하는지 확실하게 말할 수는 없습니다.
Boris Mossounov 2012

82

이것은 이 문제대한 matthiasg 의 매우 깨끗한 솔루션처럼 보입니다 .

:key="someVariableUnderYourControl"구성 요소를 완전히 재구성하려는 경우 키를 사용 하고 변경할 수도 있습니다

내 유스 케이스의 경우 Vuex getter를 소품으로 구성 요소에 공급했습니다. 어쨌든 Vuex는 데이터를 가져 오지만 구성 요소를 다시 렌더링하기 위해 반응성이 안정적으로 시작되지는 않습니다. 필자의 경우 key소품에서 속성을 일부 속성으로 설정하면 게터 (및 속성)가 마침내 해결 될 때 새로 고침이 보장됩니다.


1
이것은 깔끔한 작은 트릭입니다. 기본적으로 구성 요소를 다시 인스턴스화합니다 ( mounted실행될 것입니다)
btk

1
@btk 동의합니다. 아마도 "올바른"방법은 아니지만, 그것이 무엇인지에 대한 상당히 깨끗한 해킹입니다.
Brian Kung

1
도움이되었습니다. 경로가 변경되면 동일한 구성 요소를 다시 렌더링하기 위해 경로 전체 경로를 키로 사용합니다. : key = "$ route.fullPath"
Nirav Gandhi 님이 2009 년

44

왜?

... 강제 업데이트 가 필요 합니까?

아마도 Vue를 최대한 활용하지 않을 것입니다.

Vue 가 값 변경에 자동으로 반응하도록하려면 객체를 처음에로 선언data 해야합니다 . 또는 그렇지 않은 경우을 사용하여 추가Vue.set() 해야합니다 .

아래 데모에서 의견을 참조하십시오. 또는 여기 에서 JSFiddle 에서 동일한 데모를 십시오 .

new Vue({
  el: '#app',
  data: {
    person: {
      name: 'Edson'
    }
  },
  methods: {
    changeName() {
      // because name is declared in data, whenever it
      // changes, Vue automatically updates
      this.person.name = 'Arantes';
    },
    changeNickname() {
      // because nickname is NOT declared in data, when it
      // changes, Vue will NOT automatically update
      this.person.nickname = 'Pele';
      // although if anything else updates, this change will be seen
    },
    changeNicknameProperly() {
      // when some property is NOT INITIALLY declared in data, the correct way
      // to add it is using Vue.set or this.$set
      Vue.set(this.person, 'address', '123th avenue.');
      
      // subsequent changes can be done directly now and it will auto update
      this.person.address = '345th avenue.';
    }
  }
})
/* CSS just for the demo, it is not necessary at all! */
span:nth-of-type(1),button:nth-of-type(1) { color: blue; }
span:nth-of-type(2),button:nth-of-type(2) { color: red; }
span:nth-of-type(3),button:nth-of-type(3) { color: green; }
span { font-family: monospace }
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <span>person.name: {{ person.name }}</span><br>
  <span>person.nickname: {{ person.nickname }}</span><br>
  <span>person.address: {{ person.address }}</span><br>
  <br>
  <button @click="changeName">this.person.name = 'Arantes'; (will auto update because `name` was in `data`)</button><br>
  <button @click="changeNickname">this.person.nickname = 'Pele'; (will NOT auto update because `nickname` was not in `data`)</button><br>
  <button @click="changeNicknameProperly">Vue.set(this.person, 'address', '99th st.'); (WILL auto update even though `address` was not in `data`)</button>
  <br>
  <br>
  For more info, read the comments in the code. Or check the docs on <b>Reactivity</b> (link below).
</div>

Vue의이 부분을 마스터하려면 반응성 -변경 감지주의 사항 대한 공식 문서를 확인하십시오 . 반드시 읽어야합니다!


2
이 새로 고침 요구 사항에 의문을 제기해야하지만, 뷰포트가 변경되어 다른 자산을 표시해야하기 때문에 UI를 다시 렌더링해야하는 경우가 있습니다 (예를 들어). 데이터가 실제로 변경되지 않았을 수 있습니다.
the_dude_abides

1
왜 새로 고침해야합니까? 경우에 따라 브라우저가 캐시 한 리소스 파일 (stylesheets / js)을 일정 시간 후에 다시로드해야합니다. 7 일 후에 다시로드 해야하는 스타일 시트가 있었고 사용자가 페이지 액세스로 탭을 열어두고 7 일 후에 다시 방문하여 CSS가 7 일 이상 지난 경우.
Aurovrata

@ AchielVolckaert 아마도 대답을 이미 찾았을 Vue.set()수도 있지만 예, 구성 요소 내부에서도 작동합니다.
acdcjunior

1
@the_dude_abides와 @ Aurovrata는 합법적으로 상쾌한 사용이며 동의합니다. 내가 제기 한 질문은 사람들이 잘못된 이유로 상쾌하게하지 않는다는 것입니다.
acdcjunior

1
아마도 vue를 순수한 렌더링 도구로 사용하는 제대로 설계되지 않은 웹 응용 프로그램의 버그를 수정하려고 할 것입니다. 예를 들어 vue의 클라이언트 쪽 응용 프로그램 기능을 무시하고 서버로 갈 때마다 전체 응용 프로그램을 다시로드합니다. 현실에서는 항상 모든 가증 한 것을 고칠 시간이 없습니다.
Warren Dew

30

http://michaelnthiessen.com/force-re-render/를 읽으십시오

끔찍한 방법 : 전체 페이지를 새로 고침
끔찍한 방법 : v-if 핵 사용하기
더 좋은 방법 : Vue의 내장 forceUpdate 방법
사용하기 가장 좋은 방법 : 컴포넌트에서 키 변경

<template>
   <component-to-re-render :key="componentKey" />
</template>

<script>
 export default {
  data() {
    return {
      componentKey: 0,
    };
  },
  methods: {
    forceRerender() {
      this.componentKey += 1;  
    }
  }
 }
</script>

또한 상황에 따라 watch :를 사용합니다.


물론, 나는 당신에 동의합니다!
Diamond

나는 거의 Vue를 포기했다. 그러나이 덕분에 Vue에 대한 나의 믿음이 회복되었습니다.
jokab

링크는 실제로 끔찍한 방법을 수행하는 방법을 보여주지 않습니다. 불행히도 내 앱이 끔찍한 방법을 탐색하도록 설계 되었기 때문에 필요한 것입니다. 현재 페이지에 대한 간단한 URL이 작동하지 않는 것 같습니다. 적어도 내가 처리하는 앱에서는 작동하지 않으므로 실제로 끔찍한 방법으로 수행하는 방법에 대한 지침이 필요합니다.
Warren Dew

@WarrenDew 다음을 따르십시오 : stackoverflow.com/questions/3715047/…
Yash

25

this.$router.go(0);현재 페이지를 수동으로 다시로드하는 데 사용 하십시오.


3
더 간단 : this. $ router.go ()
Marius

사실 @MariusAndreiana - .go () 함수가 필요 하나 비 선택적 매개 변수
a_lovelace



12
<my-component :key="uniqueKey" />

그것과 함께 모든 업데이트에 대한 객체 (obj) 값의 모든 업데이트에 대해 사용 this.$set(obj,'obj_key',value)uniqueKey업데이트this.uniqueKey++

그것은 이런 식으로 나를 위해 일했다


6

이 작업을 수행 할 수있는 두 가지 방법이 있습니다.

1). $forceUpdate()메소드 핸들러 내부에서 사용할 수 있습니다.

<your-component @click="reRender()"></your-component>

<script>
export default {
   methods: {
     reRender(){
        this.$forceUpdate()
     }
   }
}
</script>

2). :key다시 렌더링하고 싶을 때 구성 요소에 속성을 부여 하고 무례하게 할 수 있습니다

<your-component :key="index" @click="reRender()"></your-component>

<script>
export default {
   data() {
     return {
        index: 1
     }
   },
   methods: {
     reRender(){
        this.index++
     }
   }
}
</script>

5

v-if 지시문 사용

<div v-if="trulyvalue">
    <component-here />
 </div>

따라서 단순히 true 값을 false에서 true로 변경하면 div 사이의 구성 요소가 다시 렌더링됩니다.


1
내 생각에 이것은 구성 요소를 다시로드하는 가장 깨끗한 방법입니다. created () 메소드에서 충분히 초기화 할 수 있습니다.
Piotr Żak

5

구성 요소를 다시로드 / 렌더링 / 새로 고침하려면 긴 코딩을 중지하십시오. Vue.JS 방식이 있습니다.

:key속성을 사용하십시오 .

예를 들면 다음과 같습니다.

<my-component :key="unique" />

BS Vue Table Slot에서 사용하고 있습니다. 이 구성 요소를 위해 무언가를 할 것이라고 말하면 독창적입니다.


3

이것은 나를 위해 일했습니다.

created() {
            EventBus.$on('refresh-stores-list', () => {
                this.$forceUpdate();
            });
        },

다른 구성 요소가 refresh-stores-list 이벤트를 발생 시키면 현재 구성 요소가 다시 렌더링됩니다.


2

방법을 찾았습니다. 약간 해 키지 만 작동합니다.

vm.$set("x",0);
vm.$delete("x");

vm뷰 모델 객체는 어디에 있고 x존재하지 않는 변수입니다.

Vue.js는 콘솔 로그에서 이에 대해 불평하지만 모든 데이터에 대해 새로 고침을 트리거합니다. 버전 1.0.26으로 테스트되었습니다.


2

나를 위해 일했다

    data () {
        return {
            userInfo: null,
            offers: null
        }
    },

    watch: {
        '$route'() {
            this.userInfo = null
            this.offers = null
            this.loadUserInfo()
            this.getUserOffers()
        }
    }

2

이 코드를 추가하십시오.

this.$forceUpdate()

행운을 빕니다


0

: key = "$ route.params.param1"은 자동 재로드 하위 항목을 매개 변수와 함께 키를 사용합니다.


4
솔루션에 대한 자세한 정보를 제공하십시오. 코드를 추가하고 키워드를 강조 표시
Agilanbu

0

다른 탭의 변경 사항으로 인해 다시 렌더링하려는 이미지 갤러리 에서이 문제가 발생했습니다. 따라서 tab1 = imageGallery, tab2 = favoriteImages

tab @ change = "updateGallery ()"-> 이렇게하면 탭을 전환 할 때마다 v-for 지시문이 필터링 된 이미지 함수를 처리합니다.

<script>
export default {
  data() {
    return {
      currentTab: 0,
      tab: null,
      colorFilter: "",
      colors: ["None", "Beige", "Black"], 
      items: ["Image Gallery", "Favorite Images"]
    };
  },
  methods: {
    filteredImages: function() {
      return this.$store.getters.getImageDatabase.filter(img => {
        if (img.color.match(this.colorFilter)) return true;
      });
    },
    updateGallery: async function() {
      // instance is responsive to changes
      // change is made and forces filteredImages to do its thing
      // async await forces the browser to slow down and allows changes to take effect
      await this.$nextTick(function() {
        this.colorFilter = "Black";
      });

      await this.$nextTick(function() {
        // Doesnt hurt to zero out filters on change
        this.colorFilter = "";
      });
    }
  }
};
</script>

0

페이지 다시로드 방법 (깜박임)을 제외하고는 죄송합니다. 아무 것도 작동하지 않습니다 (: 키가 작동하지 않음).

그리고 나는 오래된 vue.js 포럼 에서이 방법을 찾았습니다.

https://github.com/vuejs/Discussion/issues/356

<template>
    <div v-if="show">
       <button @click="rerender">re-render</button>
    </div>
</template>
<script>
    export default {
        data(){
            return {show:true}
        },
        methods:{
            rerender(){
                this.show = false
                this.$nextTick(() => {
                    this.show = true
                    console.log('re-render start')
                    this.$nextTick(() => {
                        console.log('re-render end')
                    })
                })
            }
        }
    }
</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.