Vue.$nextTick에 대해 더 깊이 이해해 보세요(원리에 대한 간략한 분석).
이 글은 Vue에 대한 순수한 지식을 공유하고, 여러분이 모르는 Vue.nextTick을 소개하고, Vue.$nextTick의 원리에 대해 이야기하는 것이 모든 분들께 도움이 되기를 바랍니다!
원칙에는 더 많은 텍스트가 포함됩니다. 인내심을 갖고 주의 깊게 음미해 보세요.
Vue의 DOM 업데이트 메커니즘
야망을 달성하기 위해 Vue를 공격적으로 사용할 때 갑자기 다음과 같은 사실을 발견하게 됩니다. 이 데이터를 변경했는데, 가져오면 왜 마지막 값인가요? (게으르기 때문에 구체적인 예를 들어주지 않겠습니다.)
이때 Vue는 다음과 같이 말할 것입니다: "Sample, here you go I don" 이해가 안 가네요. DOM이 비동기적으로 업데이트됩니다!”
간단히 말하면 Vue의 반응성은 데이터 변경 직후 DOM을 변경할 뿐만 아니라 특정 업데이트 전략에 따라 DOM도 변경합니다. 이것의 장점은 DOM에서 불필요한 작업을 방지하고 렌더링 성능을 향상시킬 수 있다는 것입니다. [관련 권장 사항: vuejs 비디오 튜토리얼, 웹 프론트 엔드 개발]
이 내용은 공식 Vue 문서에 설명되어 있습니다:
Vue가 DOM 업데이트를 비동기식으로 수행한다는 사실을 눈치채지 못했을 수도 있습니다. 데이터 변경 사항이 관찰되는 한 Vue는 대기열을 열고 동일한 이벤트 루프에서 발생하는 모든 데이터 변경 사항을 버퍼링합니다. 동일한 감시자가 여러 번 트리거되면 대기열에 한 번만 푸시됩니다. 버퍼링 중 데이터 중복 제거는 불필요한 계산 및 DOM 작업을 방지하는 데 매우 중요합니다. 그런 다음 다음 이벤트 루프 "틱"에서 Vue는 큐를 플러시하고 실제(중복 제거된) 작업을 수행합니다.
직접 말하자면 이는 실제로 JS의 이벤트 루프와 밀접하게 관련되어 있습니다. 즉, Vue는 모든 데이터 변경 사항을 먼저 렌더링할 수 없으며 동시에 이러한 변경 사항을 비동기 대기열에 넣습니다. 예를 들어 이 데이터를 세 번 수정하면 마지막 데이터만 유지됩니다. 이러한 변경 사항은 대기열 형식으로 저장될 수 있습니다. 이제 Vue가 이벤트 루프에서 DOM을 수정하는 시간은 언제입니까?
Vue에는 두 가지 옵션이 있습니다. 하나는 이 이벤트 루프가 끝날 때 DOM을 업데이트하는 것이고, 다른 하나는 이벤트 루프의 다음 라운드에 DOM 업데이트를 넣는 것입니다. z이때 You Yuxi는 가슴을 두드리며 "나에게는 두 가지 방법이 모두 있습니다!"라고 말했습니다. 그러나 이번 이벤트 루프의 최종 실행은 다음 이벤트 루프보다 훨씬 빠르기 때문에 Vue는 첫 번째 방법을 우선시합니다. . , 두 번째 메커니즘은 환경이 이를 지원하지 않는 경우에만 트리거됩니다. (??로 시작하는 링크를 보면 이벤트 루프를 이해할 수 있습니다.)
성능이 많이 향상되었지만 이벤트 루프를 한 바퀴 돌 때 코드 실행 후 문제가 발생한다는 것을 우리는 모두 알고 있습니다. 동기 실행 스택이 완료되었습니다. 비동기 큐의 내용을 실행하면 DOM을 얻는 작업이 동기식입니다! ! 데이터를 변경했음에도 불구하고 업데이트가 비동기식이며, 데이터를 얻었을 때 변경할 시간이 없었기 때문에 기사 시작 부분의 문제가 발생한다는 의미는 아닐까요?
이것. . . 이거 꼭 해야 하는데 어떻게 해야 하나요? ?
상관없습니다. Youda는 Vue.$nextTick()
Vue.$nextTick()
Vue.$nextTick()
其实一句话就可以把$nextTick
这个东西讲明白:就是你放在$nextTick
当中的操作不会立即执行,而是等数据更新、DOM更新完成之后再执行,这样我们拿到的肯定就是最新的了。
再准确一点来讲就是$nextTick
方法将回调延迟到下次DOM更新循环之后执行。(看不懂这句人话的,可以看上面[狗头])
意思我们都懂了,那$nextTick
是怎样完成这个神奇的功能的呢? 核心如下:
Vue
在内部对异步队列尝试使用原生的Promise.then
、MutationObserver
和setImmediate
,如果执行环境不支持,则会采用setTimeout(fn, 0)
代替。
仔细地看这句话,你就可以发现这不就是利用 JavaScript 的这些异步回调任务队列,来实现 Vue 框架中自己的异步回调队列。这其实就是一个典型的将底层 JavaScript 执行原理应用到具体案例中的示例。
我在这里稍微总结一下:就是$nextTick
Vue.$nextTick()
🎜을 매우 신중하게 제공했습니다. 실제로 한 문장으로$nextTick
을 명확하게 설명할 수 있습니다. $nextTick
에 넣은 작업은 즉시 실행되지 않고 데이터 업데이트 및 DOM 업데이트가 완료될 때까지 기다립니다. 나중에 실행하면 우리가 얻는 것이 확실히 최신이 될 것입니다. 🎜🎜더 정확하게 말하면 $nextTick
메서드는 다음 DOM 업데이트 주기까지 콜백을 지연합니다. (이 문장이 이해가 안 되신다면 위의 [개 머리]를 읽어보세요) 🎜🎜우리 모두 의미를 이해하고 있는데, $nextTick
은 이 마법 같은 기능을 어떻게 수행할까요? 핵심은 다음과 같습니다. 🎜🎜🎜Vue
는 내부적으로 기본 Promise.then
, MutationObserver
및 setImmediate
를 사용하려고 시도합니다. 비동기 대기열 >의 경우 실행 환경에서 이를 지원하지 않으면 setTimeout(fn, 0)
이 대신 사용됩니다. 🎜🎜🎜이 문장을 주의 깊게 살펴보면 이것이 단지 JavaScript의 비동기 콜백 작업 큐를 사용하여 Vue 프레임워크에서 자신만의 비동기 콜백 큐를 구현하는 것이 아니라는 것을 알 수 있습니다. 이는 실제로 기본 JavaScript 실행 원칙을 특정 사례에 적용하는 전형적인 예입니다. 🎜🎜여기에 조금 요약해 보겠습니다. $nextTick
은 콜백 함수를 마이크로 작업이나 매크로 작업에 넣어 실행 순서를 지연시킵니다(요약이 너무 게으른가요?) 🎜🎜The 중요한 것은 소스 코드에서 세 가지 매개변수의 의미를 이해하는 것입니다. 🎜- callback: 수행하려는 작업을 이 함수에 배치할 수 있습니다.
$nextTick
을 한 번 실행하기 전에 콜백 함수를 비동기 대기열에 넣을 것입니다. - pending:标识,用以判断在某个事件循环中是否为第一次加入,第一次加入的时候才触发异步执行的队列挂载
- timerFunc:用来触发执行回调函数,也就是
Promise.then
或MutationObserver
或setImmediate
或setTimeout
的过程
$nextTick
就会把回调函数放到一个异步队列当中;理解之后,在看整个$nextTick
里面的执行过程,其实就是把一个个$nextTick
中的回调函数压入到callback队列当中,然后根据事件的性质等待执行,轮到它执行的时候,就执行一下,然后去掉callback队列中相应的事件。
使用
说了这么多,怎么用它呢? 很简单很简单
mounted: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) }
使用场景
created中获取DOM的操作需要使用它
就是我们上面的例子,你如果想要获取最新值,就用它
还有一些第三方插件使用过程中,使用到的情况,具体问题具体分析
参考 前端进阶面试题详细解答
补充
之前我一直搞不懂一个的问题,$nextTick
既然把它传入的方法变成微任务了,那它和其它微任务的执行顺序是怎样的呢?
这简单来说就是谁先挂载Promise
对象的问题,在调用$nextTick
方法时就会将其闭包内部维护的执行队列挂载到Promise
对象,在数据更新时Vue
内部首先就会执行$nextTick
方法,之后便将执行队列挂载到了Promise
对象上,其实在明白Js
的Event Loop
模型后,将数据更新也看做一个$nextTick
方法的调用,并且明白$nextTick
方法会一次性执行所有推入的回调,就可以明白执行顺序的问题了
还有$nextTick
和nextTick
区别就是nextTick
多了一个context参数,用来指定上下文。但两个的本质是一样的,$nextTick
是实例方法,nextTick
是类的静态方法而已;实例方法的一个好处就是,自动给你绑定为调用实例的this
pending: recognition; 이벤트 루프에 처음으로 조인하는지 확인하기 위해 비동기 실행을 위한 큐 마운팅은 처음 추가될 때만 트리거됩니다.
MutationObserver
또는 setImmediate
또는 setTimeout
의 프로세스를 이해하신 후, $nextTick
의 전체 실행 프로세스는 실제로 $nextTick
의 콜백 함수를 콜백 대기열에 푸시한 다음 이벤트의 성격에 따라 실행을 기다리는 것입니다. 실행되면 실행된 후 콜백 큐에 있는 해당 이벤트가 제거됩니다. 사용
너무 많이 말했는데 어떻게 사용하나요? 매우 간단합니다rrreee사용 시나리오
보충
🎜이전에는 질문을 이해할 수 없었습니다.$nextTick
이 수신 메서드를 마이크로 태스크로 전환했기 때문에 해당 질문과 다른 마이크로 태스크가 실행되는 순서는 무엇입니까? 🎜🎜이것은 단순히 누가 Promise
객체를 먼저 마운트하느냐의 문제입니다. $nextTick
메소드가 호출되면 클로저 내부에 유지되는 실행 대기열이 Promise
객체, 데이터가 업데이트되면 Vue
는 먼저 $nextTick
메서드를 내부적으로 실행한 다음 실행 대기열을 Promise 객체는 실제로 <code>Js
의 Event Loop
모델을 이해한 후에는 데이터 업데이트도 $nextTick
에 대한 호출로 간주됩니다. > 메소드를 사용하고 $nextTick
메소드가 푸시된 모든 콜백을 한 번에 실행한다는 것을 이해하면 실행 순서의 문제를 이해할 수 있습니다🎜🎜$nextTick
및 nextTick
차이점은 nextTick
에 컨텍스트를 지정하는 추가 컨텍스트 매개변수가 있다는 것입니다. 하지만 둘의 본질은 같습니다. $nextTick
은 인스턴스 메소드이고, nextTick
은 클래스의 정적 메소드일 뿐이라는 점은 인스턴스 메소드의 한 가지 장점입니다. 자동으로 바인딩됩니다. 인스턴스의 this
를 호출하면 됩니다. 🎜🎜 (학습 영상 공유: 🎜vuejs 입문 튜토리얼🎜, 🎜기본 프로그래밍 영상🎜)🎜위 내용은 Vue.$nextTick에 대해 더 깊이 이해해 보세요(원리에 대한 간략한 분석).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











PHP와 Vue: 프론트엔드 개발 도구의 완벽한 조합 오늘날 인터넷이 빠르게 발전하는 시대에 프론트엔드 개발은 점점 더 중요해지고 있습니다. 사용자가 웹 사이트 및 애플리케이션 경험에 대한 요구 사항이 점점 더 높아짐에 따라 프런트 엔드 개발자는 보다 효율적이고 유연한 도구를 사용하여 반응형 및 대화형 인터페이스를 만들어야 합니다. 프론트엔드 개발 분야의 두 가지 중요한 기술인 PHP와 Vue.js는 함께 사용하면 완벽한 도구라고 볼 수 있습니다. 이 기사에서는 독자가 이 두 가지를 더 잘 이해하고 적용할 수 있도록 PHP와 Vue의 조합과 자세한 코드 예제를 살펴보겠습니다.

프론트엔드 개발 인터뷰에서 일반적인 질문은 HTML/CSS 기초, JavaScript 기초, 프레임워크 및 라이브러리, 프로젝트 경험, 알고리즘 및 데이터 구조, 성능 최적화, 크로스 도메인 요청, 프론트엔드 엔지니어링, 디자인 패턴, 새로운 기술 및 트렌드. 면접관 질문은 후보자의 기술적 능력, 프로젝트 경험, 업계 동향에 대한 이해를 평가하기 위해 고안되었습니다. 따라서 지원자는 자신의 능력과 전문성을 입증할 수 있도록 해당 분야에 대한 충분한 준비를 갖추어야 합니다.

인터넷 기술이 발전하면서 프론트엔드 개발이 점점 더 중요해지고 있습니다. 특히 모바일 장치의 인기는 효율적이고 안정적이며 안전하고 유지 관리가 쉬운 프런트 엔드 개발 기술을 요구합니다. 빠르게 발전하는 프로그래밍 언어로서 Go 언어는 점점 더 많은 개발자가 사용하고 있습니다. 그렇다면 프론트엔드 개발에 Go 언어를 사용하는 것이 가능할까요? 다음으로 이 글에서는 프론트엔드 개발에 Go 언어를 사용하는 방법을 자세히 설명하겠습니다. 먼저 프론트엔드 개발에 Go 언어가 사용되는 이유를 살펴보겠습니다. 많은 사람들이 Go 언어가 언어라고 생각합니다.

C# 개발자로서 우리의 개발 작업에는 일반적으로 프런트엔드와 백엔드 개발이 포함됩니다. 기술이 발전하고 프로젝트의 복잡성이 증가함에 따라 프런트엔드와 백엔드의 공동 개발이 점점 더 중요해지고 복잡해졌습니다. 이 문서에서는 C# 개발자가 개발 작업을 보다 효율적으로 완료하는 데 도움이 되는 몇 가지 프런트 엔드 및 백엔드 공동 개발 기술을 공유합니다. 인터페이스 사양을 결정한 후 프런트엔드와 백엔드의 공동 개발은 API 인터페이스의 상호 작용과 분리될 수 없습니다. 프론트엔드와 백엔드 협업 개발이 원활하게 진행되기 위해서는 가장 중요한 것은 좋은 인터페이스 사양을 정의하는 것입니다. 인터페이스 사양에는 인터페이스 이름이 포함됩니다.

Django는 빠른 개발과 깔끔한 방법을 강조하는 Python으로 작성된 웹 애플리케이션 프레임워크입니다. Django는 웹 프레임워크이지만 Django가 프런트엔드인지 백엔드인지에 대한 질문에 답하려면 프런트엔드와 백엔드의 개념에 대한 깊은 이해가 필요합니다. 프론트엔드는 사용자가 직접 상호작용하는 인터페이스를 의미하고, 백엔드는 HTTP 프로토콜을 통해 데이터와 상호작용하는 서버측 프로그램을 의미합니다. 프론트엔드와 백엔드가 분리되면 프론트엔드와 백엔드 프로그램을 독립적으로 개발하여 각각 비즈니스 로직과 인터랙티브 효과, 데이터 교환을 구현할 수 있습니다.

빠르고 효율적인 프로그래밍 언어인 Go 언어는 백엔드 개발 분야에서 널리 사용됩니다. 그러나 Go 언어를 프런트엔드 개발과 연관시키는 사람은 거의 없습니다. 실제로 프런트엔드 개발에 Go 언어를 사용하면 효율성이 향상될 뿐만 아니라 개발자에게 새로운 지평을 열어줄 수도 있습니다. 이 기사에서는 프런트엔드 개발에 Go 언어를 사용할 수 있는 가능성을 살펴보고 독자가 이 영역을 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 전통적인 프런트엔드 개발에서는 사용자 인터페이스를 구축하기 위해 JavaScript, HTML, CSS를 사용하는 경우가 많습니다.

인스턴트 메시징을 구현하는 방법에는 WebSocket, Long Polling, Server-Sent Events, WebRTC 등이 있습니다. 자세한 소개: 1. 실시간 양방향 통신을 달성하기 위해 클라이언트와 서버 사이에 지속적인 연결을 설정할 수 있는 WebSocket 프런트 엔드는 WebSocket API를 사용하여 WebSocket 연결을 생성하고 송수신을 통해 인스턴트 메시징을 달성할 수 있습니다. 2. 실시간 통신 등을 시뮬레이션하는 기술인 Long Polling

Vue는 단일 페이지 애플리케이션을 구축하는 데 널리 사용되는 인기 있는 JavaScript 프레임워크입니다. 반응형 데이터 바인딩과 구성 요소화된 아키텍처를 채택하고 다양한 편리한 도구와 방법을 제공합니다. Vue에서는 데이터가 변경되면 Vue가 해당 변경 사항을 반영하도록 뷰를 자동으로 업데이트합니다. 그러나 목록에 새 항목을 추가해야 하는 경우와 같이 데이터가 업데이트된 후 즉시 DOM 요소를 조작해야 하는 상황이 있습니다. 이때 Vue에서 제공하는 $nextTick 메소드를 사용하여 D를 비동기적으로 업데이트할 수 있습니다.
