VUE基础2
vue过滤器
目的: 转换格式, 过滤器就是一个函数, 传入值返回处理后的值
过滤器只能用在, 插值表达式和v-bind表达式
Vue中的过滤器场景
- 字母转大写, 输入"hello", 输出"HELLO"
- 字符串翻转, “输入hello, world”, 输出"dlrow ,olleh"
语法:
- Vue.filter(“过滤器名”, (值) => {return “返回处理后的值”}) (写在main.js文件当中)
- filters: {过滤器名字: (值) => {return “返回处理后的值”} (写在default对象当中)
例子:
- 全局定义字母都大写的过滤器
- 局部定义字符串翻转的过滤器
<template>
<div>
<p>原来的样子: {{ msg }}</p>
<!-- 2. 过滤器使用
语法: {{ 值 | 过滤器名字 }}
-->
<p>使用翻转过滤器: {{ msg | reverse }}</p>
<p :title="msg | toUp">鼠标长停</p>
</div>
</template>
<script>
export default {
data(){
return {
msg: 'Hello, Vue'
}
},
// 方式2: 局部 - 过滤器
// 只能在当前vue文件内使用
/*
语法:
filters: {
过滤器名字 (val) {
return 处理后的值
}
}
*/
filters: {
toUp (val) {
return val.toUpperCase()
}
}
}
</script>
<style>
</style>
总结: 把值转成另一种形式, 使用过滤器, Vue3用函数替代了过滤器.
全局注册最好在main.js中注册, 一处注册到处使用
vue过滤器-传参和多过滤器
目标: 可同时使用多个过滤器, 或者给过滤器传参
- 语法:
- 过滤器传参: vue变量 | 过滤器(实参)
- 多个过滤器: vue变量 | 过滤器1 | 过滤器2
<template>
<div>
<p>原来的样子: {{ msg }}</p>
<!-- 1.
给过滤器传值
语法: vue变量 | 过滤器名(值)
-->
<p>使用翻转过滤器: {{ msg | reverse('|') }}</p>
<!-- 2.
多个过滤利使用
语法: vue变量 | 过滤器1 | 过滤器2
-->
<p :title="msg | toUp | reverse('|')">鼠标长停</p>
</div>
</template>
<script>
export default {
data(){
return {
msg: 'Hello, Vue'
}
},
filters: {
toUp (val) {
return val.toUpperCase()
}
}
}
</script>
<style>
</style>
总结: 过滤器可以传参, 还可以对某个过滤器结果, 后面在使用一个过滤器
vue计算属性
目标: 一个数据, 依赖另外一些数据计算而来的结果
语法:
-
computed: { "计算属性名" () { return "值" } }
需求:
- 需求: 求2个数的和显示到页面上
<template>
<div>
<p>{{ num }}</p>
</div>
</template>
<script>
export default {
data(){
return {
a: 10,
b: 20
}
},
// 计算属性:
// 场景: 一个变量的值, 需要用另外变量计算而得来
/*
语法:
computed: {
计算属性名 () {
return 值
}
}
*/
// 注意: 计算属性和data属性都是变量-不能重名
// 注意2: 函数内变量变化, 会自动重新计算结果返回
computed: {
num(){
return this.a + this.b
}
}
}
</script>
<style>
</style>
注意: 计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同
总结: 一个数据, 依赖另外一些数据计算而来的结果
vue计算属性完整写法
目标: 计算属性也是变量, 如果想要直接赋值, 需要使用完整写法
语法:
computed: {
"属性名": {
set(值){
},
get() {
return "值"
}
}
}
需求:
- 计算属性给v-model使用
页面准备输入框
<template>
<div>
<div>
<span>姓名:</span>
<input type="text" v-model="full">
</div>
</div>
</template>
<script>
// 问题: 给计算属性赋值 - 需要setter
// 解决:
/*
完整语法:
computed: {
"计算属性名" (){},
"计算属性名": {
set(值){
},
get(){
return 值
}
}
}
*/
export default {
computed: {
full: {
// 给full赋值触发set方法
set(val){
console.log(val)
},
// 使用full的值触发get方法
get(){
return "无名氏"
}
}
}
}
</script>
<style>
</style>
总结: 想要给计算属性赋值, 需要使用set方法
vue侦听器
目标: 可以侦听data/computed属性值改变
语法:
-
watch: { "被侦听的属性名" (newVal, oldVal){ } }
完整例子代码:
<template>
<div>
<input type="text" v-model="name">
<input type="text" v-model="user.name">
<input type="text" v-model="user.age">
</div>
</template>
<script>
export default {
data() {
return {
name: "",
user: {
name: "",
age: 0
}
}
},
watch: {
name(newVal,oldVal) {
console.log(newVal,oldVal)
},
// 侦听器完整写法
user: {
handler(newVal,oldVal) {
console.log(newVal,oldVal)
},
// 深度侦听
deep: true,
// 立即侦听
immediate: true
}
}
}
</script>
<style>
</style>
vue组件
组件是可复用的 Vue 实例, 封装标签, 样式和JS代码
组件化 :封装的思想,把页面上 可重用的部分
封装为 组件
,从而方便项目的 开发 和 维护
一个页面, 可以拆分成一个个组件,一个组件就是一个整体, 每个组件可以有自己独立的 结构 样式 和 行为(html, css和js)
vue组件使用步骤:
1.创建需要复用的vue组件在components文件夹下,例如创建组件 components/Pannel.vue
2.注册组件: 创建后需要注册后再使用
全局注册:全局入口在main.js, 在new Vue之上注册
语法:
import Vue from 'vue'
import 组件对象 from 'vue文件路径'
Vue.component("组件名", 组件对象)
例如:
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
// 1.引入全局组件
import Pannel from './components/Pannel'
// 2.注册组件
Vue.component("Pannel",Pannel)
new Vue({
render: h => h(App),
}).$mount('#app')
全局注册Panne组件名后, 就可以当做标签在任意Vue文件中template里用
局部注册:
语法:
import 组件对象 from 'vue文件路径'
export default {
components: {
"组件名": 组件对象
}
}
在需要的vue文件中中引入, 注册, 使用
例如:
<template>
<div>
<!-- 3.全局组件的使用 -->
<Pannel></Pannel>
<Pannel></Pannel>
<Pannel></Pannel>
<!-- 4.局部组件的使用 -->
<PannelJb></PannelJb>
<PannelJb></PannelJb>
<PannelJb></PannelJb>
</div>
</template>
<script>
// 1.引入局部组件
import PannelJb from "./components/Pannel_2"
export default {
// 2.注册局部组件
components: {
PannelJb: PannelJb
}
}
</script>
<style>
</style>
vue组件的通信
1.父向子传值:(被引入的vue文件是子文件)
步骤:
-
创建组件components/MyProduct.vue - 作为子文件组件
-
组件内在props定义变量, 用于接收外部传入的值
<template> <div class="my-product"> <h3>标题: {{ title }}</h3> <p>价格: {{ price }}元</p> <p>{{ intro }}</p> </div> </template> <script> export default { props: ['title', 'price', 'intro'] } </script> <style> .my-product { width: 400px; padding: 20px; border: 2px solid #000; border-radius: 5px; margin: 10px; } </style>
-
App.vue中引入注册组件, 使用时, 传入具体数据给组件显示
<template> <div> <Product title="好吃的口水鸡" price="50" intro="开业大酬宾, 全场8折"></Product> <Product title="好可爱的可爱多" price="20" intro="老板不在家, 全场1折"></Product> <Product title="好贵的北京烤鸭" price="290" :intro="str"></Product> </div> </template> <script> // 1. 创建组件 (.vue文件) // 2. 引入组件 import Product from './components/MyProduct' export default { data(){ return { str: "好贵啊, 快来啊, 好吃" } }, // 3. 注册组件 components: { // Product: Product // key和value变量名同名 - 简写 Product } } </script> <style> </style>
注:父向子组件传入数据时,子组件只能读此数据,不能对父传入的数据进行修改
2.子组件向父通信:
使用场景:子组件想要去改变父中的数据
使用语法:
-
父中: @自定义事件名=“父methods函数”
<template> <div><template> <div> //此处subprice为自定义事件,需要this.$emit()触发 <Product v-for="(obj,ind) in list" @subprice="fn"></Product> </div> </template> <script> import Product from "./components/MyProduct _2"; export default { components: { Product }, methods: { fn(i,price) { this.list[i].proprice -= price } } }; </script> <style> </style>
-
子组件中: this.$emit(“自定义事件名”, 传值) - 执行父methods里函数代码
<script>
export default {
props: ['index'],
methods: {
sub() {
// this.$emit()用于触发事件
this.$emit("subprice",this.index,1)
}
}
}
</script>
父传入的数据进行修改
2.子组件向父通信:
使用场景:子组件想要去改变父中的数据
使用语法:
-
父中: @自定义事件名=“父methods函数”
<template> <div><template> <div> //此处subprice为自定义事件,需要this.$emit()触发 <Product v-for="(obj,ind) in list" @subprice="fn"></Product> </div> </template> <script> import Product from "./components/MyProduct _2"; export default { components: { Product }, methods: { fn(i,price) { this.list[i].proprice -= price } } }; </script> <style> </style>
-
子组件中: this.$emit(“自定义事件名”, 传值) - 执行父methods里函数代码
<script>
export default {
props: ['index'],
methods: {
sub() {
// this.$emit()用于触发事件
this.$emit("subprice",this.index,1)
}
}
}
</script>