Vue

简介: 1. computed计算属性2. watch侦听器3. 组件注册全局组件局部组件注册4. 组件间通信父组件传递给子组件(props)Props有两种常见用法非props的attribute子组件传递给父组件($emit)

1. computed计算属性

任何包含响应式数据的复杂逻辑,都应该使用计算属性

计算属性将被混入到组件实例中

所有getter和setter的this 上下文自动的绑定为组件实例


computed计算缓存

computed是有缓存的

也就是说当数据不发生变化时,计算属性时不需要重新计算的

但是如果依赖的数据发生改变了,计算属性依旧会重新进行计算

<divid="app"><!--调用多次--><h2>{{full}}</h2><h2>{{full}}</h2><h2>{{full}}</h2><h2>{{full}}</h2><div>computed: {
// 默认是一个函数 fullName() {
returnthis.firstName+' - '+this.lastName  },
// 也可以是一个对象full:{
get() {
//只会打印一次 因为数据没有变化console.log("11111")
returnthis.firstName+this.lastName    }
  },
textt:{
get() {
returnthis.texts.split(' ').reverse().join(" ")
    }
  }
},

cumptued计算属性的get和set

computed: {
// 对象写法fullName: {
get() {
returnthis.firsetName+this.lastName          },
set(value) {
constvalues=value.split(' ')
this.firsetName=values[0]
this.lastName=values[1]
          }
        }
      },
methods: {
btns() {
this.fullName="你好 世界"        }
      }

2. watch侦听器

用于声明在数据更改时调用的侦听回调

官方文档

<divid="app"><h2>{{message}}</h2><button@click="btns">修改</button></div>constapp=Vue.createApp({
data() {
return {
message: "hello world"        }
      },
methods: {
btns() {
this.message="你好世界"        }
      },
watch: {
message(val, oldval) {
console.log("我改变了", val, oldval)
        }
      }

侦听器的配置

watch: {
info: {
handler(newvalue, oldvalue) {
console.log(Vue.toRaw(newvalue,oldvalue))
    },
// 深度监听deep: true,
// 第一次监听immediate:true  }
}

3. 组件注册

全局组件:在任何其他的组件中都可以使用的组件

局部组件:只有在注册的组件中才能使用的组件

全局组件

import { createApp } from'vue'constapp=createApp({})
app.component(
// 注册的名字'MyComponent',
// 组件的实现  {
/* ... */  }
)
<divid="app"><my-home></my-home></div><templateid="test"><h2>你好</h2></template><script>constApp= {}
constapp=Vue.createApp(App)
app.component("my-home",{
template:'#test',
data() {
return {
        }
      },
m注册局部组件使用components<divid="app"><product-item></product-item></div><templateid="icon"><div><h1>我是一个MyComponent组件</h1><h4>{{title}}</h4></div></template><script>constapp=Vue.createApp({
components: {
ProductItem: {
template: '#icon',
data() {
return {
title: "我是标题"            }
          }
        }
      },
data() {
return {
        }
      },
methods: {
      },
computed: {
      },
wathch: {
      },
    })
// 挂载app.mount("#app")ethods: {
      },
    })
// 挂载app.mount("#app")
</script>

局部组件注册

注册局部组件使用components<divid="app"><product-item></product-item></div><templateid="icon"><div><h1>我是一个MyComponent组件</h1><h4>{{title}}</h4></div></template><script>constapp=Vue.createApp({
components: {
ProductItem: {
template: '#icon',
data() {
return {
title: "我是标题"            }
          }
        }
      },
data() {
return {
        }
      },
methods: {
      },
computed: {
      },
wathch: {
      },
    })
// 挂载app.mount("#app")

4. 组件间通信

官方文档

父组件传递给子组件:通过props属性

子组件传递给父组件:通过$emit触发事件

父组件传递给子组件(props)

场景:子组件传递给父组件需要不同的值时

<template><divclass="app"><!--个人信息一个展示小明一个展示小李--><app-infosname="小明"/><app-infosname="小李"/></div></template>

使用方法:

  1. 首先在父组件注册一些自定义的attribute
  2. 父组件给子组件attribute赋值
  3. 子组件通过props接受对应的attribute

注意:props接受的属性会被暴露到this上

<app-infosname="小明"/><app-infosname="小李"/>exportdefault {
props:['name'],
data() {
return {
    }
  },
created() {
// props会暴露到 this 上console.log(this.name)
  }
}

Props有两种常见用法

数组和对象

props: {
name: {
type:String,
defalut: '我是默认值'    },
age :{
type:Number,
defalut: 0    },
// 如果是一个复杂数据类型 必须写一个函数friend: {
type:Object,
defalut:() => ({ name : 'xiaoluo'} )
    } 
  },
exportdefault {
props: {
// 基础类型检查//(给出 `null` 和 `undefined` 值则会跳过任何类型检查)propA: Number,
// 多种可能的类型propB: [String, Number],
// 必传,且为 String 类型propC: {
type: String,
required: true    },
// Number 类型的默认值propD: {
type: Number,
default: 100    },
// 对象类型的默认值propE: {
type: Object,
// 对象或者数组应当用工厂函数返回。// 工厂函数会收到组件所接收的原始 props// 作为参数default(rawProps) {
return { message: 'hello' }
      }
    },
// 自定义类型校验函数propF: {
validator(value) {
// The value must match one of these stringsreturn ['success', 'warning', 'danger'].includes(value)
      }
    },
// 函数类型的默认值propG: {
type: Function,
// 不像对象或数组的默认,这不是一个工厂函数。这会是一个用来作为默认值的函数default() {
return'Default function'      }
    }
  }
}

非props的attribute

当父组件传递属性给子组件时,子组件没有用props接受,那么这个属性被称为非props的attribute

非props的attribute会自动添加到子组件的根元素上面

<divclass="app"><!--后面两个属性没有用props接受会自动添加到子组件的根元素上面--><app-infosnames="xiaoluo" :age="20"address="广州市"class="box"/></div>props: {
names: {
type:String,
default: '我是默认值'    },
age :{
type:Number,
default: 100    }
  }

如果不想让子组件接收(穿透)可以设置inheritAttrs属性

exportdefault {
//设置为false后,非props的attribute不会穿透给子组件的根元素inheritAttrs:false,
props: {
names: {
type:String,
default: '我是默认值'    },
age :{
type:Number,
default: 100    }
  }
}

子组件传递给父组件($emit)

场景:

  1. 当子组件有一些事件发生时,父组件需要接收
  2. 子组件有一些内容想要传递给父组件的时候

案列:点击子组件修改父组件的数字

<template><divclass="app"><h2>当前技术:{{counter}}</h2><!--子组件传递的事件--><count-add@addClick="addBtns"></count-add><count-sub@subClick="subBtns"></count-sub></div></template><script>importCountAddfrom"./components/CountAdd.vue"importCountSubfrom"./components/CountSub.vue"exportdefault {
components: {
CountAdd,
CountSub  },
data() {
return {
counter: 0    }
  },
methods: {
addBtns(index) {
this.counter+=index    },
subBtns(index) {
this.counter-=index    }
  }
}
</script><stylescoped></style><template><divclass="countadd"><divclass="add"><button@click="addCount(1)">+1</button><button@click="addCount(5)">+5</button><button@click="addCount(10)">+10</button></div></div></template><script>exportdefault {
// 用于声明由组件触发的自定义事件。emits:['addClick'],
methods: {
addCount(index) {
// 自定义事件 this.$emit("addClick",index)
    }
  }
}
</script><stylelang="less"scoped></style>


相关文章
|
13天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
28 1
vue学习第四章
|
13天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
26 1
vue学习第九章(v-model)
|
13天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
28 1
vue学习第十章(组件开发)
|
18天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
19天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
19天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
19天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
18天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
26 3
|
20天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
18天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
37 2