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

간단한 질문입니다.

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



답변

이 마법 주문을보십시오 :

vm.$forceUpdate();

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

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

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


답변

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

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

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


답변

왜?

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

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


답변

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 :를 사용합니다.


답변

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


답변

사용하십시오 vm.$set('varName', value). Change_Detection_Caveats 에서 세부 사항을 찾으십시오 .


답변

물론 .. 키 속성을 사용하여 언제든지 다시 렌더링 (복제) 할 수 있습니다.

<mycomponent :key="somevalueunderyourcontrol"></mycomponent>

예제는 https://jsfiddle.net/mgoetzke/epqy1xgf/ 를 참조 하십시오.

https://github.com/vuejs/Discussion/issues/356#issuecomment-336060875 에서도 논의되었습니다.