Vue3 选项式的状态选项

1.data 声明组件初始响应式状态的函数

  1. 作用:声明初始变量
  2. data必须使用函数返回对象的方式存储数据。因为这种方式每次调用都会返回一个新的数据对象,如果data写成对象形式,不同组件会使用同一个data(共用一个引用地址),导致数据混乱
  3. 调用:data内的数据可以直接在标签中使用 {{ }} 调用
  • 示例
	<div id="app">
        <div>{{userName}}</div>
    </div>

	<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    userName: '张三'
                }
            }
        })
        app.mount('#app')
    </script>

2. methods 声明要混入到组件实例中的方法

  1. 作用:声明方法
  2. methods是一个对象,存储该组件的方法
  3. 调用: 在标签上使用 @事件='方法'
  • 示例
	<div id="app">
        <div @click="fn">{{userName}}</div>
    </div>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    userName: '张三'
                }
            },
            methods: {
                fn() {
                    this.userName = '李四'
                }
            }
        })
        app.mount('#app')
    </script>

3. computed 计算属性

  1. 作用:基于现有数据通过一些计算得出一个新的数据,用于到模板中使用

  2. 写法:对象形式,
    • key值是计算属性的名字,
    • value值是一个对象,对象中包含一个get函数(必需)和一个set函数(选需),函数返回值作为该计算属性的值

  3. 调用:computed内的数据可以直接在标签中使用 {{ }} 调用

  4. 特点:
    (1) 计算属性只读,不可修改
    (2) 有缓存,get函数默认只执行一次,返回值会缓存起来,后续多次调用同一个计算属性不会触发get函数的多次执行,而是使用上一次执行的缓存结果
    (3) 计算属性与函数的区别:计算属性有缓存,性能更优秀。

  5. get函数:
    (1) 默认执行一次
    (2) 需要有返回值,返回值的内容就是计算属性的值
    (3) 函数内使用到数据会作为该计算属性的一个依赖项,当依赖项发生变化时,该get函数会重新执行,最终计算属性的值也会跟着变化
    (4) 不能有副作用,不能写异步逻辑,不能操作DOM,不能改变外部的其他数据


    6.set函数:
    • 当计算属性发生变化后触发,可以间接改变外部数据
  • 示例
	<div id="app">
        <div>{{userName}}</div>
        <div>姓:{{cutName}}</div>
        <div @click="cutName = '李四'">修改</div>
    </div>
    
	<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    userName: '张三'
                }
            },
            computed: {
                cutName: {
                    get() {
                        console.log(1111);
                        return this.userName[0]
                    },
                    set(value) {
                        this.userName = '王五' 
                    },
                }
            }
        })
        app.mount('#app')
    </script>

4. watch 侦听器

  1. 作用:在状态变化时执行对应操作
  2. 写法:
    (1) 函数式:多用于监听变量或对象的某个属性。监听变量时,函数名要和监听的变量名相同;监听对象的某个属性时,函数名为"对象名.属性名"
    (2) 对象式:用于监听变量或对象(也可以是对象的某个属性)。key名要和监听的对象名(变量名、"对象名.属性名")相同,
    • value值为一个对象,handler函数(用于监听新旧数据)
    • immediate: true 开启加载自动触发一次
    • deep: true 开始深度监听(如果监听对象,只有开启深度监听才能监听对象内的属性值变化)
  3. handler函数特点:
    (1) 有两个参数(newVal:改变后的值, oldVal:改变前的值)
    (2) 函数式无法默认触发,只有对象式中设置了immediate: true 才会开启,(函数式无法默认触发)
    (3) 监听对象时,无法监听深层数据的改变,如果需要深层监听,需要设置deep: true ,(函数式无法深层监听)
    (4) 该函数可以做异步操作、修改DOM、修改外部其他数据
    (5) 该函数不需要返回值
  • 示例
	<div id="app">
        <div>userName:{{userName}}</div>
        <div>name:{{name.xing}}{{name.ming}}</div>
        <button @click="userName = '李四'">修改变量userName</button>
        <button @click="name.xing = '王'">修改变量userName.xing</button>
        <button @click="name.ming = '五'">修改变量userName.ming</button>
    </div>

	<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    userName: '张三',
                    name: {
                        xing: '赵',
                        ming: '六'
                    }
                }
            },
            watch: {

                //监听普通变量的值
                userName(newVal, oldVal) {
                    console.log(111, newVal, oldVal);
                },

                //监听对象中的某个属性值
                'name.xing'(newVal, oldVal) {
                    console.log(222, newVal, oldVal);
                },

                //无法直接监听对象(方法二),必须开启深度监听,对象的属性值改变才能触发
                name: {
                    handler(newVal, oldVal) {
                        console.log(333, newVal, oldVal);
                    },

                    // immediate: true, // 默认触发一次
                    deep: true,      // 启用深度监听
                }
            }
        })
        app.mount('#app')
    </script>

5. components 局部注册组件

  1. 作用:局部注册子组件
  2. 写法:对象式,
    • key是组件名,用<组件名>调用,不能有大写字母
    • value是组件实例
  3. 特点:只能在当前组件使用注册的子组件
  • 示例
	<div id="app">
        <firstchild></firstchild>
        <secondchilld></secondchilld>
    </div>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>

        const secondChilld = {
            //子组件模板
            template: `<div>全局注册</div>`
        }

        const app = Vue.createApp({
            //局部注册子组件
            components: {
                //key是组件名,用<组件名>调用,不能有大写字母
                //value是组件实例
                firstchild: {
                    //子组件模板
                    template: `<div>局部注册</div>`
                }
            },
        })

        //全局注册子组件
        //参数一:组件名,用<组件名>调用,不能有大写字母
        //参数二:组件实例
        app.component('secondchilld', secondChilld)
        app.mount('#app')
    </script>

6. props 声明接收父组件传递的参数

  1. 作用:声明接收父组件传递的参数,
  2. 写法:
    • 数组形式接收参数:只能声明接收的参数,不能声明参数的数据类型
    • 对象形式接收参数:可以声明接收的参数,可以声明对传入的 props 的校验要求
  3. 特点:
    • 父组件传递的参数只有在props中声明,才能在子组件中调用,调用方式和data相同
    • 接收到的参数与声明的props校验要求不符时,浏览器不报错,但会警告
  • 示例
<div id="app">
	<!-- 标签上的属性会传递到子组件上 -->
    <!-- 属性值可以是基本数据类型、引用数据类型、动态属性(使用v-bin绑定一个变量) -->
	<firstchild name1="张三" age1="18"></firstchild>
	<secondchild name2="李四" age2="20"></secondchild>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
	const app = Vue.createApp({
	//注册子组件
	components: {
		firstchild: {
			//子组件模板
			template: `<div>欢迎,{{ name1 }} - {{ age1 }}</div>`,
			//Props 声明,用于接收父组件传递过来的参数
			//数组形式接收props
			props: ["name1", "age1"],
			//挂载完成函数钩子
			mounted() {
				console.log('数组形式接收props', this.name1 + ':' + this.age1);
			},
		},
		secondchild: {
			//子组件模板
			template: `<div>欢迎,{{ name2 }} - {{ age2 }}</div>`,
			//对象形式接收props
			props: {
				//key:接收的属性名,value:期望接收到的属性值的类型
				//接收到的属性值的类型和期望接收到的属性值的类型不符,浏览器不会报错,只会警告
				'name2': String,
				'age2': Number
			},
			//挂载完成函数钩子
			mounted() {
				console.log('对象形式接收props', this.name2 + ':' + this.age2);
			},
		}
	}
});

app.mount("#app");
</script>
  1. props校验
    • 只有对象形式接收父组件参数才能声明对传入的 props 的校验要求
  • 示例
  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 strings
        return ['success', 'warning', 'danger'].includes(value)
      }
    },
    
    // 函数类型的默认值
    propG: {
      type: Function,
      // 不像对象或数组的默认,这不是一个
      // 工厂函数。这会是一个用来作为默认值的函数
      default() {
        return 'Default function'
      }
    }
  }

7. emits

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值