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>


相关文章
|
2天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
2天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
2天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
2天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
3天前
|
JavaScript
Vue devDependencies 与 dependencies 能别
Vue devDependencies 与 dependencies 能别
10 3
|
2天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
2天前
|
JavaScript
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
该博客文章介绍了如何在Vue 2框架下实现前后端分离的商品信息展示和详情页跳转,包括排序筛选、详情展示、加入购物车和分享功能。
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
|
2天前
|
JavaScript
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
这篇文章介绍了在Vue中如何使用Swiper插件创建轮播图,解决Swiper左右切换按钮不生效的问题,并展示了如何将Swiper轮播图抽离成一个可复用的公共组件,同时提供了详细的安装、配置和优化建议。
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件