本节:依旧是明歌的视频。
这部分主要是组合式API vue3的写法。

一、自定义组件emit事件(子传父) this.$emit("自定义方法名");

直接在方法写表达式,比较快,直接把变量设置成false
![]()
二、slot插槽(父传子)

这样写只能实现内容显示,如果子组件需要存储变量,进行更深的逻辑,则需要prop来接受父页面传过来的变量。

子组件也可以在插槽传值给父组件。

效果:

三、使用v-model,子组件改变父组件的内容。


PS:键盘监听,如果按回车,子件就修改内容,按esc就消失子件。

我想要按下回车之后,不只是修改,还同时让子件消失。我写了个变量放在修改的方法里面,一开始为真,然后写监听事件,那个变量一发生变化,就调用让组件消失的方法。

四、组合式API,也就是vue3
我们通过组合式 API 解决了两个问题。
1.我们让组件拥有了更加良好的代码组织结构
2.我们让相同的代码逻辑在不同的组件中进行了完整的复用
(不用写this了)
(1)ref修改变量,本质和获取dom,修改id差不多,只是写法不同 。变量是 变量名.value ,数组是通过下标来取值。

因为组合式API写法不一样,所以(2)生命周期的写法也不一样。
1.首先引入 2.写法的不同

(3)watch和computed的写法
1.首先引入 2.写法的不同

(4)props和emit还有方法的写法。

(5)子组件的引入

ps:新建完还遇到一个问题就是,怎么调样式都不正确,然后到处注释,其实是最简单的,就是我找到了整个项目唯一的style代码,全部注释了就可以了

以上所有内容的代码
1.父页面
-
- <template>
- <div>
- <div @click="clickMe1">{{ text1.name }}div>
-
- <div>
- {{ "今天天气是:" + weather + "现在时间是" + new Date().toISOString() }}
- div>
- <hr>
- <div>{{ todata }}div>
- <button @click="showme = !showme"> 点击出现招呼button>
-
- <son-one v-model="weather" content="你是山间的清泉,你是夏天傍晚的微风" @closeOne="showme = false" v-if="showme">
- <template #content="contentindex">
- <div>{{ contentindex.meimei }}div>
- <div>第一百次心动是:{{ weather }}div>
- template>
-
- son-one>
- div>
- template>
-
-
- <script>
- import sonOne from './components/son.vue'
- export default {
- components: { sonOne },
- data() {
-
- return {
-
- weather: "雨天",
- showme: false,
- text1: {
- name: "张楚梅"
- }
- };
- },
- methods: {
- clickMe1() {
-
- this.text1.name = "袁楚天,天天"
- },
- },
- computed: {
- todata() {
- return "今天天气是:" + this.weather + ",现在时间是" + new Date().toISOString()
- },
- },
- watch: {
- text1: {
- handler: function (newVal, oldVal) {
- console.log(newVal, oldVal);
-
- },
- deep: true
- },
- weather: {
- handler: function (newVal, oldVal) {
- console.log(newVal, oldVal);
- },
- deep: true
- }
- }
-
- }
- script>
-
- <style scoped>
-
- style>
子组件:
- <template>
- <div style="background-color: pink;width: 400px;height: 400px;">
-
- <div>早上好,公主</div>
- <div>
- {{ content }}
- <slot meimei="梅梅" name="content"></slot>
- </div>
- <div><input v-model="res" @keyup.enter="hello" @keyup.esc="cancel"></div>
- <button @click="hello">你好哇</button>
- <button @click="cancel">再见</button>
- </div>
-
- </template>
- <script>
- export default {
- data() {
- return {
- res: "",
- watch1: false,
- }
- },
- watch: {
- watch1:
- {
- handler: function (newVal, oldVal) {
- console.log(newVal, oldVal);
- this.cancel();
- },
- deep: true
- }
- },
- methods: {
- hello() {
- this.$emit("update:model-value", this.res);
- this.$emit("close", { name: "小天" });
- this.watch1 = true;
- },
- cancel() {
- console.log(this.content)
- this.$emit("closeOne");
- },
- },
- props: {
- content: {
- type: String,
- default: "",
- },
- },
- modelValue: {
- type: String,
- default: "",
- },
-
- }
- </script>