계산된 속성
우리는 데이터의 일부 데이터가 템플릿의 보간 구문을 통해 직접 표시될 수 있다는 것을 알고 있지만 경우에 따라 데이터를 표시하기 전에 데이터에 일부 변환을 수행해야 하거나 여러 데이터를 결합해야 할 수도 있습니다. 표시
템플릿에서 표현식을 사용하면 매우 편리할 수 있지만 원래는 간단한 작업을 위해 설계되었습니다. 템플릿에 너무 많은 논리를 넣으면 템플릿이 과중해지고 유지 관리가 어려워지며, 여러 곳에 사용하면 문제가 발생합니다. 중복되는 코드가 많을 것입니다
그래서 비즈니스 로직과 UI 인터페이스를 분리하려고 합니다. 한 가지 방법은 로직을 메소드로 추출하는 것이지만 이 접근 방식에는 다음과 같은 단점이 있습니다
모든 데이터 사용이 메소드가 됩니다. call
데이터를 여러 번 얻으려면 캐싱 없이 해당 로직을 실행하기 위해 메소드를 여러 번 호출해야 합니다
사실 는 모든 응답 유형에 대한 것입니다. 복잡한 데이터 로직의 경우 계산된 속성 사용
对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性
<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3 id="nbsp-fullname-nbsp">{{ fullname }}</h3> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, computed: { fullname() { return this.firstname + ' ' + this.lastname } } }).mount('#app')
缓存
计算属性会基于它们的依赖关系进行缓存,在数据不发生变化时,计算属性是不需要重新计算的
但是如果依赖的数据发生变化,在使用时,计算属性依然会重新进行计算
并且界面会使用最新的计算属性的值进行重新渲染
getter 和 setter
计算属性在大多数情况下,只需要一个getter方法即可,所以我们会将计算属性直接写成一个函数
<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3 id="nbsp-fullname-nbsp">{{ fullname }}</h3> <button @click="change">change</button> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, methods: { change() { this.fullname = 'Alex Li' } }, computed: { // 计算属性的完整写法 fullname: { get() { return this.firstname + ' ' + this.lastname }, set(v) { this.firstname = v.split(' ')[0] this.lastname = v.split(' ')[1] } } } }).mount('#app') </script>
侦听器
在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中,当数据变化时,template会自动进行更新来显示最新的数据
但是在某些情况下,我们希望在代码逻辑中监听某个数据的变化,这个时候就需要用侦听器watch来完成了
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { // 可以使用watch监听响应式数据的改变 // 对应有两个参数 // 参数一 --- 新值 // 参数二 --- 旧值 info(newV, oldV) { // 如果监听的值是对象,获取到的新值和旧值是对应对象的代理对象 console.log(newV, oldV) // 代理对象 转 原生对象 // 1. 使用浅拷贝获取一个新的对象,获取的新的对象为原生对象 console.log({...newV}) // 2. 使用Vue.toRaw方法获取原生对象 console.log(Vue.toRaw(newV)) } }, methods: { change() { this.info = { name: 'Steven' } } } }).mount('#app')
配置选项
属性 | 说明 |
---|---|
deep | 是否开启深度监听 值为boolean 未开启的时候,如果监听的是对象,那么只有对象的引用发生改变的时候,才会触发watch回调 开始后,如果监听的是对象,那么只要对象中的任意一个属性发生了改变,就会触发watch回调 |
immediate | 是否立即开始监听 默认情况下,初次渲染是不会触发watch监听,只有当值发生改变后,才会触发watch监听 将immediate设置为true后,初次渲染也会触发watch监听,此时oldValue的值为undefined |
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { info: { // 开启了深度监听后,当info的属性发生改变的时候,就会触发对应的watch回调 // 注意: 和直接修改info引用不同的是,如果直接修改的是对象的属性 // 那么此时newV和oldV是同一个对象的引用, 此时也就获取不到对应的旧值 handler(newV, oldV) { console.log(newV, oldV) console.log(newV === oldV) // => true }, deep: true, immediate: true } }, methods: { change() { this.info.name = 'Steven' } } }).mount('#app')
其它写法
直接监听对象属性
watch: { 'info.name'(newV, oldV){ console.log(newV, oldV) } }
字符串写法
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { // watch的值如果是一个字符串的时候 // 会自动以该字符串作为函数名去methods中查找对应的方法 'info.name': 'watchHandler' }, methods: { change() { this.info.name = 'Steven' }, watchHandler(newV, oldV){ console.log(newV, oldV) } } }).mount('#app')
数组写法
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { 'info.name': [ 'watchHandler', function handle() { console.log('handler2') }, { handler() { console.log('handler3') } } ] }, methods: { change() { this.info.name = 'Steven' }, watchHandler(){ console.log('handler1') } } }).mount('#app')
$watch
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, created() { /* $watch 参数列表 参数一 --- 侦听源 参数二 --- 侦听回调 参数三 --- 配置对象 */ this.$watch('info.name', (newV, oldV) => console.log(newV, oldV), { immediate: true }) }, methods: { change() { this.info.name = 'Steven' } } }).mount('#app')
캐싱
계산된 속성은 종속성에 따라 캐시됩니다. 데이터가 변경되지 않으면 계산된 속성을 새로 고칠 필요가 없습니다.🎜🎜그러나 종속 데이터가 변경되면 계산된 속성은 사용 시 계속 다시 계산됩니다🎜🎜그리고 인터페이스는 최신 계산된 속성 값을 사용하여 다시 렌더링됩니다🎜getter 및 setter
🎜 대부분의 경우 계산된 속성에는 다음 사항만 필요합니다. getter 메소드이므로 계산된 속성을 함수로 직접 작성하겠습니다.🎜rrreee🎜 리스너🎜🎜는 데이터가 반환하는 객체의 데이터를 정의합니다. 이 데이터는 보간 구문 등을 통해 전달됩니다. 데이터가 변경되면 템플릿이 자동으로 업데이트되어 최신 데이터를 표시합니다🎜🎜그러나 경우에 따라 코드 로직에서 특정 데이터의 변경 사항을 모니터링해야 합니다. 이 경우 감지를 사용해야 합니다. 리스너 감시가 완료되었습니다🎜 rrreee구성 옵션
속성 | 설명 |
---|---|
deep | 심층 모니터링 활성화 여부 값은 부울입니다. 활성화되지 않은 경우 개체가 모니터링되면 개체의 참조만 변경됩니다. watch 콜백 시작 후 객체가 모니터링되면 객체의 속성이 변경되는 한 watch 콜백이 트리거됩니다. |
즉시 | 모니터링 즉시 시작 여부 기본적으로 첫 번째 렌더링에서는 시계 모니터링이 트리거되지 않습니다. 값이 변경될 때만 시계 모니터링이 트리거됩니다. immediate를 true로 설정합니다. 초기 렌더링은 시계 모니터링도 트리거합니다. 이때 oldValue의 값은 정의되지 않습니다. |
다른 쓰기 방법
🎜 객체 속성 직접 모니터링
🎜rrreee🎜문자열 쓰기
🎜rrreee🎜배열 쓰기
🎜rrreee🎜$watch
🎜rrreee위 내용은 Vue3에서 계산된 속성과 리스너를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

前端有没有现成的库,可以直接用来绘制 Flowable 流程图的?下面本篇文章就跟小伙伴们介绍一下这两个可以绘制 Flowable 流程图的前端库。

vue不是前端css框架,而是前端JavaScript框架。Vue是一套用于构建用户界面的渐进式JS框架,是基于MVVM设计模式的前端框架,且专注于View层。Vue.js的优点:1、体积小;2、基于虚拟DOM,有更高的运行效率;3、双向数据绑定,让开发者不用再去操作DOM对象,把更多的精力投入到业务逻辑上;4、生态丰富、学习成本低。

Vue3如何更好地使用qrcodejs生成二维码并添加文字描述?下面本篇文章给大家介绍一下Vue3+qrcodejs生成二维码并添加文字描述,希望对大家有所帮助。

本篇文章我们来了解 Vue2.X 响应式原理,然后我们来实现一个 vue 响应式原理(写的内容简单)实现步骤和注释写的很清晰,大家有兴趣可以耐心观看,希望对大家有所帮助!


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

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