웹 프론트엔드 JS 튜토리얼 Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)

Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)

Jun 24, 2020 pm 02:10 PM
vue 구성 요소

Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)

때때로 데이터 업데이트에 대한 Vue의 응답성에 의존하는 것만으로는 충분하지 않습니다. 대신 데이터를 업데이트하기 위해 구성 요소를 수동으로 다시 렌더링해야 합니다. 아니면 현재 DOM을 버리고 다시 시작하고 싶을 수도 있습니다. 그렇다면 Vue를 통해 구성 요소를 올바른 방식으로 다시 렌더링하려면 어떻게 해야 할까요?

Vue가 구성 요소를 다시 렌더링하도록 하는 가장 좋은 방법은 구성 요소에 :key를 설정하는 것입니다. 컴포넌트를 다시 렌더링해야 하는 경우 key 값만 변경하면 Vue가 컴포넌트를 다시 렌더링합니다. :key。 当我们需要重新渲染组件时,只需更 key 的值,Vue 就会重新渲染组件。

这是一个非常简单的解决方案。

当然,你可能会对其他方式会更感兴趣:

  • 简单粗暴的方式:重新加载整个页面
  • 不妥的方式:使用 v-if
  • 较好的方法:使用Vue的内置forceUpdate方法
  • 最好的方法:在组件上进行 key 更改

简单粗暴的方式:重新加载整个页面

这相当于每次你想关闭应用程序时都要重新启动你的电脑。

Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)

这种方式或许有用,但这是一个非常糟糕的解决方案,不要这样做,我们来看看更好的方法。

不妥的方式:使用 v-if

v-if指令,该指令仅在组件为true时才渲染。 如果为false,则该组件在DOM中不存在。

来看看,v-if 是怎么工作的,在template中,添加v-if指令:

<template>
  <my-component v-if="renderComponent" />
</template>
로그인 후 복사

script 中,使用nextTick的方法

<script>
  export default {
    data() {
      return {
        renderComponent: true,
      };
    },
    methods: {
      forceRerender() {
        // 从 DOM 中删除 my-component 组件
        this.renderComponent = false;
        
        this.$nextTick(() => {
          // 在 DOM 中添加 my-component 组件
          this.renderComponent = true;
        });
      }
    }
  };
</script>
로그인 후 복사

上面的过程大致如下:

  1. 刚开始 renderComponent设置为true,因此渲染 my-component 组件
  2. 当我们调用forceRerender时,我们立即将renderComponent设置为false
  3. 我们停止渲染my-component,因为v-if指令现在计算结果为false
  4. nextTick方法中将renderComponent设置回true
  5. v-if指令的计算结果为true时,再次渲染my-component

在这个过程中,有两个部分比较重要

首先,我们必须等到nextTick,否则我们不会看到任何变化。

Vue中,一个 tick 是一个DOM更新周期。Vue将收集在同一 tick 中进行的所有更新,在 tick 结束时,它将根据这些更新来渲染 DOM 中的内容。如果我们不等到next tick,我们对renderComponent的更新就会自动取消,什么也不会改变。

其次,当我们第二次渲染时,Vue将创建一个全新的组件。 Vue 将销毁第一个,并创建一个新的,这意味着我们的新my-component将像正常情况一样经历其所有生命周期-createdmounted等。

另外,nextTick 可以与 promise 一起使用:

forceRerender() {
  // 从 DOM 中删除 my-component 组件
  this.renderComponent = false;

  this.$nextTick().then(() => {
    this.renderComponent = true;
  });
}
로그인 후 복사

不过,这并不是一个很好的解决方案,所以,让我们做 Vue 想让我们做的

较好的方法:forceUpdate 方法

这是解决这个问题的两种最佳方法之一,这两种方法都得到了Vue的官方支持。

通常情况下,Vue 会通过更新视图来响应依赖项中的更改。然而,当我们调用forceUpdate时,也可以强制执行更新,即使所有依赖项实际上都没有改变。

下面是大多数人使用这种方法时所犯的最大错误。

如果 Vue 在事情发生变化时自动更新,为什么我们需要强制更新呢?

原因是有时候 Vue 的响应系统会让人感到困惑,我们认为Vue会对某个属性或变量的变化做出响应,但实际上并不是这样。在某些情况下,Vue的响应系统根本检测不到任何变化。

所以就像上一个方法,如果你需要这个来重新渲染你的组件,可能有一个更好的方法。

有两种不同的方法可以在组件实例本身和全局调用forceUpdate

// 全局
import Vue from &#39;vue&#39;;
Vue.forceUpdate();

// 使用组件实例
export default {
  methods: {
    methodThatForcesUpdate() {
      // ...
      this.$forceUpdate();
      // ...
    }
  }
}
로그인 후 복사

重要提示:这不会更新任何计算属性,调用forceUpdate仅仅强制重新渲染视图。

最好的方法:在组件上进行 key이것은 매우 간단한 솔루션입니다.

물론, 다른 방법에 더 관심이 있을 수도 있습니다:

  • 간단하고 조잡한 방법: 전체 페이지를 다시 로드
  • 부적절한 방법: v-if </code 사용 ></li><li>더 나은 방법: Vue에 내장된 <code>forceUpdate 메서드 사용
  • 가장 좋은 방법: 구성 요소 /code>의 key< 변경</li ></ul>🎜🎜<span style="font-size: 18px;">간단하고 투박한 방법: 전체 페이지를 다시 로드🎜🎜🎜🎜이는 매번 애플리케이션을 닫는 것과 같습니다. 매번 컴퓨터를 다시 시작하세요. 🎜🎜<span class="img-wrap"><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/895/836/640/1580865290269986.gif" class="lazy" title="1580865290269986.gif" alt= "Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)"/>🎜🎜🎜이 접근 방식은 효과가 있을 수 있지만 매우 나쁜 해결책입니다. 🎜하지 마세요🎜, 더 나은 방법을 살펴보겠습니다. 🎜🎜<span style="max-width:90%">🎜부적절한 방법: 🎜🎜<code>v-if🎜🎜🎜🎜v-if 명령을 사용하세요. 지시문은 구성 요소가 true인 경우에만 렌더링됩니다. false인 경우 구성요소가 🎜DOM🎜에 존재하지 않는 것입니다. 🎜🎜v-if가 어떻게 작동하는지 살펴보겠습니다. templatev-if 지시어를 추가하세요: 🎜
    const people = [
      { name: &#39;Evan&#39;, age: 34 },
      { name: &#39;Sarah&#39;, age: 98 },
      { name: &#39;James&#39;, age: 45 },
    ];
    로그인 후 복사
    로그인 후 복사
    🎜In < In code>스크립트 , nextTick 메소드를 사용하세요 🎜
    <ul>
      <li v-for="(person, index) in people" :key="index">
        {{ person.name }} - {{ index }}
      </li>
    </ul>
    
    // Outputs
    Evan - 0
    Sarah - 1
    James - 2
    로그인 후 복사
    로그인 후 복사
    🎜위의 과정은 대략 다음과 같습니다: 🎜
    1. 처음에는 renderComponent가 설정됩니다 true로 설정하면 my-comComponent 구성 요소를 렌더링합니다.
    2. forceRerender를 호출하면 즉시 renderComponent< /code ><code>false로 설정
    3. v-if 지시문이 이제 my-comComponent로 평가되므로 렌더링을 중지합니다. code >false
    4. nextTick에서 renderComponenttrue
    5. 로 다시 설정하세요. 메소드 v-if 명령의 계산 결과가 true이면 my-comComponent
    를 다시 렌더링합니다. 이 프로세스에는 더 중요한 두 부분이 있습니다🎜🎜먼저 nextTick까지 기다려야 합니다. 그렇지 않으면 변경 사항이 표시되지 않습니다. 🎜🎜🎜Vue🎜에서는 1틱이 DOM 업데이트 주기입니다. Vue는 동일한 틱에서 이루어진 모든 업데이트를 수집하고 틱이 끝나면 해당 업데이트를 기반으로 DOM의 콘텐츠를 렌더링합니다. 다음 틱까지 기다리지 않으면 renderComponent 업데이트가 자동으로 취소되고 아무 것도 변경되지 않습니다. 🎜🎜두 번째로, 두 번째로 렌더링할 때 Vue는 완전히 새로운 구성 요소를 생성합니다. Vue는 첫 번째 것을 파괴하고 새로운 것을 생성합니다. 이는 새로운 my-comComponentcreated, < code>mounted<와 같이 모든 수명 주기를 거친다는 것을 의미합니다. /코드>등 🎜🎜또한, nextTick은 promise와 함께 사용할 수 있습니다:🎜
    Evan - 0
    James - 1
    로그인 후 복사
    로그인 후 복사
    🎜그러나 이것은 그다지 좋은 해결책이 아니므로 Vue가 원하는 대로 합시다🎜🎜🎜더 나은 방법: forceUpdate 방법🎜🎜🎜🎜이 문제를 해결하는 가장 좋은 두 가지 방법 중 하나이며, 둘 다 Vue에서 공식적으로 지원됩니다. 🎜🎜일반적으로 Vue는 뷰를 업데이트하여 종속성 변경에 응답합니다. 그러나 forceUpdate를 호출하면 모든 종속성이 실제로 변경되지 않은 경우에도 강제로 업데이트할 수도 있습니다. 🎜🎜이 방법을 사용할 때 대부분의 사람들이 저지르는 가장 큰 실수는 다음과 같습니다. 🎜🎜상황이 바뀔 때 Vue가 자동으로 업데이트된다면 강제로 업데이트해야 하는 이유는 무엇입니까? 🎜🎜그 이유는 Vue의 응답 시스템이 때때로 혼란스러울 수 있기 때문입니다. 우리는 Vue가 특정 속성이나 변수의 변경에 응답할 것이라고 생각하지만 실제로는 그렇지 않습니다. 어떤 경우에는 Vue의 반응 시스템이 변경 사항을 전혀 감지하지 못하는 경우도 있습니다. 🎜🎜이전 방법과 마찬가지로 구성 요소를 다시 렌더링하는 데 이 방법이 필요한 경우 더 나은 방법이 있을 수 있습니다. 🎜🎜구성 요소 인스턴스 자체에서 그리고 전역적으로 forceUpdate를 호출하는 두 가지 방법이 있습니다. 🎜
    const people = [
      { id: &#39;this-is-an-id&#39;, name: &#39;Evan&#39;, age: 34 },
      { id: &#39;unique-id&#39;, name: &#39;Sarah&#39;, age: 98 },
      { id: &#39;another-unique-id&#39;, name: &#39;James&#39;, age: 45 },
    ];
    
    <ul>
      <li v-for="person in people" :key="person.id">
        {{ person.name }} - {{ person.id }}
      </li>
    </ul>
    로그인 후 복사
    로그인 후 복사
    🎜중요: 이 방법은 계산된 속성을 업데이트하지 않으며 forceUpdate를 호출하면 다시 강제 업데이트됩니다. -뷰를 렌더링합니다. 🎜🎜🎜가장 좋은 방법: 구성 요소에서 🎜🎜를 변경합니다🎜🎜🎜🎜많은 경우 구성 요소를 다시 렌더링해야 합니다. . 🎜

    要正确地做到这一点,我们将提供一个key属性,以便 Vue 知道特定的组件与特定的数据片段相关联。如果key保持不变,则不会更改组件,但是如果key发生更改,Vue 就会知道应该删除旧组件并创建新组件。

    正是我们需要的!

    但是首先,我们需要绕一小段路来理解为什么在Vue中使用key

    为什么我们需要在 Vue 中使用 key

    一旦你理解了这一点,那么这是了解如何以正确方式强制重新渲染的很小的一步。

    假设我们要渲染具有以下一项或多项内容的组件列表:

    • 有本地的状态
    • 某种初始化过程,通常在createdmounted钩子中
    • 通过jQuery或普通api进行无响应的DOM操作

    如果你对该列表进行排序或以任何其他方式对其进行更新,则需要重新渲染列表的某些部分。 但是,不会希望重新渲染列表中的所有内容,而只是重新渲染已更改的内容。

    为了帮助 Vue 跟踪已更改和未更改的内容,我们提供了一个key属性。 在这里使用数组的索引,因为索引没有绑定到列表中的特定对象。

    const people = [
      { name: &#39;Evan&#39;, age: 34 },
      { name: &#39;Sarah&#39;, age: 98 },
      { name: &#39;James&#39;, age: 45 },
    ];
    로그인 후 복사
    로그인 후 복사

    如果我们使用索引将其渲染出来,则会得到以下结果:

    <ul>
      <li v-for="(person, index) in people" :key="index">
        {{ person.name }} - {{ index }}
      </li>
    </ul>
    
    // Outputs
    Evan - 0
    Sarah - 1
    James - 2
    로그인 후 복사
    로그인 후 복사

    如果删除Sarah,得到:

    Evan - 0
    James - 1
    로그인 후 복사
    로그인 후 복사

    James关联的索引被更改,即使James仍然是JamesJames会被重新渲染,这并不是我们希望的。

    所以这里,我们可以使用唯一的 id 来作为 key

    const people = [
      { id: &#39;this-is-an-id&#39;, name: &#39;Evan&#39;, age: 34 },
      { id: &#39;unique-id&#39;, name: &#39;Sarah&#39;, age: 98 },
      { id: &#39;another-unique-id&#39;, name: &#39;James&#39;, age: 45 },
    ];
    
    <ul>
      <li v-for="person in people" :key="person.id">
        {{ person.name }} - {{ person.id }}
      </li>
    </ul>
    로그인 후 복사
    로그인 후 복사

    在我们从列表中删除Sarah之前,Vue删除了SarahJames的组件,然后为James创建了一个新组件。现在,Vue知道它可以为EvanJames保留这两个组件,它所要做的就是删除Sarah的。

    如果我们向列表中添加一个person,Vue 还知道可以保留所有现有的组件,并且只需要创建一个新组件并将其插入正确的位置。这是非常有用的,当我们有更复杂的组件,它们有自己的状态,有初始化逻辑,或者做任何类型的DOM操作时,这对我们很有帮助。

    所以接下来看看,如果使用最好的方法来重新渲染组件。

    更改 key 以强制重新渲染组件

    最后,这是强制Vue重新渲染组件的最佳方法(我认为)。

    我们可以采用这种将key分配给子组件的策略,但是每次想重新渲染组件时,只需更新该key即可。

    这是一个非常基本的方法

    <template>
      <component-to-re-render :key="componentKey" />
    </template>
    
    
    export default {
      data() {
        return {
          componentKey: 0,
        };
      },
      methods: {
        forceRerender() {
          this.componentKey += 1;  
        }
      }
    }
    로그인 후 복사

    每次forceRerender被调用时,我们的componentKey都会改变。当这种情况发生时,Vue将知道它必须销毁组件并创建一个新组件。我们得到的是一个子组件,它将重新初始化自身并“重置”其状态。

    如果确实需要重新渲染某些内容,请选择key更改方法而不是其他方法。

    原文地址:https://hackernoon.com/the-correct-way-to-force-vue-to-re-render-a-component-bde2caae34ad

    推荐学习:vue视频教程

    위 내용은 Vue에서 구성 요소를 올바르게 다시 렌더링하는 방법은 무엇입니까? (방법 소개)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Vue에서 부트 스트랩을 사용하는 방법 Vue에서 부트 스트랩을 사용하는 방법 Apr 07, 2025 pm 11:33 PM

vue.js에서 bootstrap 사용은 5 단계로 나뉩니다 : Bootstrap 설치. main.js.의 부트 스트랩 가져 오기 부트 스트랩 구성 요소를 템플릿에서 직접 사용하십시오. 선택 사항 : 사용자 정의 스타일. 선택 사항 : 플러그인을 사용하십시오.

Vue 용 버튼에 기능을 추가하는 방법 Vue 용 버튼에 기능을 추가하는 방법 Apr 08, 2025 am 08:51 AM

HTML 템플릿의 버튼을 메소드에 바인딩하여 VUE 버튼에 함수를 추가 할 수 있습니다. 메소드를 정의하고 VUE 인스턴스에서 기능 로직을 작성하십시오.

Vue에서 시계를 사용하는 방법 Vue에서 시계를 사용하는 방법 Apr 07, 2025 pm 11:36 PM

vue.js의 시계 옵션을 사용하면 개발자가 특정 데이터의 변경 사항을들을 수 있습니다. 데이터가 변경되면 콜백 기능을 트리거하여 업데이트보기 또는 기타 작업을 수행합니다. 구성 옵션에는 즉시 콜백을 실행할지 여부와 DEEP를 지정하는 즉시 포함되며, 이는 객체 또는 어레이에 대한 변경 사항을 재귀 적으로 듣는 지 여부를 지정합니다.

Vue 다중 페이지 개발은 무엇을 의미합니까? Vue 다중 페이지 개발은 무엇을 의미합니까? Apr 07, 2025 pm 11:57 PM

VUE 멀티 페이지 개발은 vue.js 프레임 워크를 사용하여 응용 프로그램을 구축하는 방법입니다. 여기서 응용 프로그램은 별도의 페이지로 나뉩니다. 코드 유지 보수 : 응용 프로그램을 여러 페이지로 분할하면 코드를보다 쉽게 ​​관리하고 유지 관리 할 수 ​​있습니다. 모듈 식 : 각 페이지는 쉬운 재사용 및 교체를 위해 별도의 모듈로 사용할 수 있습니다. 간단한 라우팅 : 페이지 간의 탐색은 간단한 라우팅 구성을 통해 관리 할 수 ​​있습니다. SEO 최적화 : 각 페이지에는 자체 URL이있어 SEO가 도움이됩니다.

vue.js로 JS 파일을 참조하는 방법 vue.js로 JS 파일을 참조하는 방법 Apr 07, 2025 pm 11:27 PM

vue.js에서 JS 파일을 참조하는 세 가지 방법이 있습니다. & lt; script & gt; 꼬리표;; mounted () 라이프 사이클 후크를 사용한 동적 가져 오기; Vuex State Management Library를 통해 수입.

Vue가 이전 페이지로 돌아 오는 방법 Vue가 이전 페이지로 돌아 오는 방법 Apr 07, 2025 pm 11:30 PM

vue.js는 이전 페이지로 돌아갈 수있는 네 가지 방법이 있습니다. $ router.go (-1) $ router.back () 사용 & lt; router-link to = & quot;/quot; Component Window.history.back () 및 메소드 선택은 장면에 따라 다릅니다.

Vue Traversal 사용 방법 Vue Traversal 사용 방법 Apr 07, 2025 pm 11:48 PM

vue.js가 트래버스 어레이 및 객체에 대한 세 가지 일반적인 방법이 있습니다. V- 결합 지시문은 V-FOR와 함께 사용하여 각 요소의 속성 값을 동적으로 설정할 수 있습니다. .MAP 메소드는 배열 요소를 새 배열로 변환 할 수 있습니다.

Vue의 div로 점프하는 방법 Vue의 div로 점프하는 방법 Apr 08, 2025 am 09:18 AM

VUE에서 DIV 요소를 점프하는 두 가지 방법이 있습니다. VUE 라우터를 사용하고 라우터 링크 구성 요소를 추가하십시오. @Click 이벤트 리스너를 추가하고 이것을 호출하십시오. $ router.push () 메소드를 점프하십시오.

See all articles