写组件的过程中没写过的vue3写法

news2024/11/16 13:41:45

这是我写的组件,

父组件代码:

子组件代码:

首先遇到的问题是,我希望点击draw的确定按钮显示dialog弹框,发现不能在dialog弹框中去定义true和false,要在外部传进去,所以我注释了子组件中的const hideOrshowItem = ref(false)代码,

然后子文件中用的所有的hideOrshowItem就都报错找不到了,然后使用defineProps获取hideOrshowItem,这时候就应该有了,但还是报错,于是询问了chatGPT:

问:

还是报错

回答:

在你的代码中,hideOrshowItem是一个组件的属性,你应该从props中获取它。你可以使用toRefs函数将props对象转换为响应式的变量,并使用解构赋值来获取hideOrshowItem属性。

下面是修改后的代码示例:

<script setup lang="ts">
import { ref, defineProps, toRefs } from "vue";

const props = defineProps<{
  title: string;
  text: string;
  hideOrshowItem: boolean;
}>();

const { hideOrshowItem } = toRefs(props);

function closeAlert() {
  hideOrshowItem.value = !hideOrshowItem.value;
  console.log(hideOrshowItem.value, "hideorshowitem");
}

function showDialog() {
  console.log("展示dialog");
  hideOrshowItem.value = true;
}

function clickButton() {
  console.log("点击按钮");
  hideOrshowItem.value = !hideOrshowItem.value;
  console.log(hideOrshowItem.value, "hideorshowitem");
}
</script>

<template>
  <div>
    <a @click="showDialog">点击打开 Dialog</a>
    <div class="wrapper" :class="{ 'dialog-style': !hideOrshowItem }"></div>
    <div class="white-box" :class="{ 'dialog-style': !hideOrshowItem }">
      <div class="headline">
        <span>{{ props.title }}</span>
        <svg
          t="1697281987826"
          class="icon"
          viewBox="0 0 1024 1024"
          version="1.1"
          xmlns="http://www.w3.org/2000/svg"
          p-id="4001"
          xmlns:xlink="http://www.w3.org/1999/xlink"
          width="14"
          height="14"
          @click="closeAlert()"
        >
          <path
            d="M899.174 154.603l-29.782-29.782-357.397 361.114-357.397-361.114-29.782 29.782 361.114 357.397-361.114 357.397 29.782 29.782 357.397-361.114 357.397 361.114 29.782-29.782-361.114-357.397z"
            p-id="4002"
            fill="#bfbfbf"
          ></path>
        </svg>
      </div>
      <div class="text">{{ props.text }}</div>
      <div class="footer">
        <button class="btn" @click="clickButton">取消</button>
        <button class="btn" @click="clickButton">确定</button>
      </div>
    </div>
  </div>
</template>

修改代码后确实可以获取了,使用了toRefs结构出hideOrshowItem来使用

现在点击draw的确定按钮可以显示dialog弹框了,但有个问题,dialog的取消确定和关闭按钮点击都没有效果,查看控制台console结果hideOrshowItem都是true,点多少次都是true,继续问chatGPT:

问:

打印出来结果一直是true

回答:

hideOrshowItem是一个从父组件中接收的props属性,不能直接修改,需要使用emit来通知父组件修改props属性值。你需要在子组件中定义一个事件,并调用$emit()方法来触发该事件以通知父组件更新。

修改后的代码示例如下:

<script setup lang="ts">
import { defineProps, toRefs, defineEmits } from "vue";

const props = defineProps<{
  title: string;
  text: string;
  hideOrshowItem: boolean;
}>(); // 定义属性

const { hideOrshowItem } = toRefs(props); // 将hideOrshowItem变为响应式的变量

const emits = defineEmits(["update:hideOrshowItem"]); // 定义事件

function closeAlert() {
  emits("update:hideOrshowItem", false); // 发送update事件给父组件
}

function showDialog() {
  emits("update:hideOrshowItem", true); // 发送update事件给父组件
}

function clickButton() {
  emits("update:hideOrshowItem", !hideOrshowItem.value); // 发送update事件给父组件,并传递新的hideOrshowItem值
}
</script>

<template>
  <div>
    <a @click="showDialog">点击打开 Dialog</a>
    <div class="wrapper" :class="{ 'dialog-style': !hideOrshowItem }"></div>
    <div class="white-box" :class="{ 'dialog-style': !hideOrshowItem }">
      <div class="headline">
        <span>{{ props.title }}</span>
        <svg
          t="1697281987826"
          class="icon"
          viewBox="0 0 1024 1024"
          version="1.1"
          xmlns="http://www.w3.org/2000/svg"
          p-id="4001"
          xmlns:xlink="http://www.w3.org/1999/xlink"
          width="14"
          height="14"
          @click="closeAlert()"
        >
          <path
            d="M899.174 154.603l-29.782-29.782-357.397 361.114-357.397-361.114-29.782 29.782 361.114 357.397-361.114 357.397 29.782 29.782 357.397-361.114 357.397 361.114 29.782-29.782-361.114-357.397z"
            p-id="4002"
            fill="#bfbfbf"
          ></path>
        </svg>
      </div>
      <div class="text">{{ props.text }}</div>
      <div class="footer">
        <button class="btn" @click="clickButton">取消</button>
        <button class="btn" @click="clickButton">确定</button>
      </div>
    </div>
  </div>
</template>

我们在子组件写了emits来使用defineEmits相符组件传递update:hideOrshowItem

当点击closeAlert,showDialog和clickButton的时候会传递相应的true或false给父组件,

在上面的代码中,我们使用defineEmits()定义一个名为update:hideOrshowItem的事件,用来通知父组件更新hideOrshowItem属性。然后在closeAlert()showDialog()clickButton()方法中,我们调用emits()函数来发出update事件并传递新的hideOrshowItem值。这样就可以让父组件更新hideOrshowItem的值了

到这里子组件给父组件传递了update:hideOrshowItem,那副组件肯定要接受,所以继续问:

问:

父组件怎么写

回答:

在父组件中,你需要使用子组件并传递hideOrshowItem属性,并监听子组件的update:hideOrshowItem事件来更新hideOrshowItem的值。

下面是一个示例,展示了父组件如何使用子组件和更新hideOrshowItem的值:

<template>
  <div>
    <ChildComponent :hideOrshowItem="hideOrshowItem" @update:hideOrshowItem="updateHideOrshowItem" />
    <button @click="toggleHideOrshowItem">切换 hideOrshowItem 的值</button>
  </div>
</template>

<script>
import ChildComponent from "@/components/ChildComponent.vue";

export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      hideOrshowItem: true,
    };
  },
  methods: {
    updateHideOrshowItem(value) {
      this.hideOrshowItem = value;
    },
    toggleHideOrshowItem() {
      this.hideOrshowItem = !this.hideOrshowItem;
    },
  },
};
</script>

上述代码是chatGPT举了一个父组件的例子,使用@update:hideOrshowItem来触发一个事件更新控制dialog显示的值,

我们的父组件写法上面有,

定义updateHideOrshowItem事件,e接收的是true或者false,因为我们控制dialog显示隐藏的值是:hideOrshowItem="showDialog",所以控制showDialog.value是true或者false实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年四川省网络与信息安全技能大赛初赛 个人赛 Writeup

文章目录 WebPHPs Endingweb-game-1-1can_you_getshell Pwnbabyshell Reversepacked MiscedocneBaby_TCP Web PHP’s Ending 反序列化、eval截断、无参数RCE <?php// error_reporting(0);// highlight_file(__FILE__);class saday{public $reason"things dont work…

如何借助边缘智能网关打造智慧城市便民驿站

智慧城市驿站是一类提供多样化便利服务的新型智能公共设施&#xff0c;通过融合物联网技术、边缘智能技术、新能源技术等&#xff0c;为城市居民整合提供休闲、购物、卫生、广告、安全等公共服务&#xff0c;进一步提升日常生活体验。本篇就为大家介绍如何基于边缘智能网关&…

React 路由总结 react-router-dom6+react-router-dom5

开题 单页面应用和多页面应用 SPA&#xff1a;单页面应用程序&#xff0c;整个应用中只有一个页面(index.html) MPA&#xff1a;多页面应用程序&#xff0c;整个应用中有很多页面(*.html) react路由 现在的前端应用大多都是SPA单页面应用程序&#xff0c;也就是一个HTML页面的…

C++ 与 Lua 数据交互载体——栈

一、栈 Lua 和 C 之间的通讯主要组件是无处不在的虚拟栈&#xff0c;两者间的数据交换都是通过这个栈进行。 栈中可以保存 Lua 任意类型的值。 1、Lua 和 C 之间的数据交互存在的差异 Lua 是动态类型&#xff0c;C 是静态类型&#xff0c;两者不匹配Lua 是自动内存管理&…

【周末闲谈】VR新视界,“眼”见未来

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言虚拟现实(VR)技术虚拟现实技术的原理虚拟现实技术发…

v-model表单数据双向绑定-表单提交示例

示例如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-model表单数据双向绑定<…

【Note】CNN与现代卷积神经网络part3(附PyTorch代码)

文章目录 2 现代卷积神经网络2.1 批量规范化2.1.1 训练深层网络2.1.2 批量规范化层2.1.2.1 全连接层2.1.2.2 卷积层2.1.2.3 预测过程中的批量规范化 2.1.3 从零实现2.1.4 使用批量规范化层的 LeNet2.1.5 简明实现2.1.6 controversies&#xff08;争议&#xff09;2.1.7 Summary…

YOLOv7改进:新机制,扩展DCNv3,基于DCNv2优化 | CVPR2023 InternImage

💡💡💡本文属于原创独家改进:DCNv3优势:1) 共享投射权重;2) 引入多组机制;3)采样点调制标量归一化; DCNv3 | 亲测在多个数据集实现暴力涨点; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOL…

Flink学习之旅:(一)Flink部署安装

1.本地搭建 1.1.下载Flink 进入Flink官网&#xff0c;点击Downloads 往下滑动就可以看到 Flink 的所有版本了&#xff0c;看自己需要什么版本点击下载即可。 1.2.上传解压 上传至服务器&#xff0c;进行解压 tar -zxvf flink-1.17.1-bin-scala_2.12.tgz -C ../module/ 1.3.启…

随机专享记录第一话 -- RustDesk的自我搭建和使用

1.介绍 RustDesk是继TeamView、向日葵等远程桌面软件后的新起之秀,最主要的是开源的可自己搭建中继服务。相比于公共服务器,连接一次等待的时间要多久,用过TeamView的都知道,而且还是免费的,不像某些远程搞各种个人证书,各种登录设备限制! 先看看软件图,这是待连接界…

14.11 Socket 基于时间加密通信

在之前的代码中我们并没有对套接字进行加密&#xff0c;在未加密状态下我们所有的通信内容都是明文传输的&#xff0c;这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密&#xff0c;此处笔者将演示一种基于时间的加密方法&#xff0c;该加密方法的优势是数…

微信小程序获取手机号(2023年10月 python版)[无需订阅]

技术栈&#xff1a; 1. 微信开发者工具中的调试基础库版本&#xff1a;3.1.2。 2. 后台&#xff1a;django。 步骤&#xff1a; 1. 首先在后台django项目的定时任务中增加一个下载access_token函数&#xff0c;并把得到的access_token保存在数据库中&#xff08;其实随便哪里…

SpringCloud学习笔记-gateway网关自定义全局过滤器

需求&#xff1a;定义全局过滤器&#xff0c;拦截请求&#xff0c;判断请求的参数是否满足下面条件&#xff1a; 参数中是否有authorization&#xff0c; authorization参数值是否为admin 如果同时满足则放行&#xff0c;否则拦截 实现&#xff1a; 在gateway中定义一个过…

C语言实现通讯录(超详细)

1.实现怎样一个通讯录 实现一个通讯录联系人信息&#xff1a;1.可以保存100个人的信息名字2.添加联系人年龄3.删除指定联系人性别4.查找指定联系人电话5.修改指定联系人住址6.排序联系人7.显示所有联系人信息 2.通讯录的实现 2.1创建两个源文件和一个头文件 首先我们创建con…

C++DAY47

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

数据结构----算法--五大基本算法(这里没有写分支限界法)和银行家算法

数据结构----算法–五大基本算法&#xff08;这里没有写分支限界法&#xff09;和银行家算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况&#xff0c;只考虑眼前的这一步&#xff0c;在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

Vue跨域配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 配置详情 请在项目的vue.config.js中通过proxy的配置&#xff0c;解决Vue跨域&#xff1b;代码如下&#xff1a; const { defineConfig } require(vue/cli-service) modu…

用JavaScript输出0-9的两种方法、以及setTimeout的三个参数的意义

方法一&#xff1a; for (let i 0; i < 10; i) {setTimeout(() > {console.log(i);}, 1000) } 方法二&#xff1a;利用 setTimeout 函数的第三个参数&#xff0c;会作为回调函数的第一个参数传入 for (var i 0; i < 10; i) {setTimeout(i > {console.log(i);…

canvas画布中beginPath和closePath的作用要点

1.画笔画完一个图案后&#xff0c;立即又回到了原点&#xff0c;所以下次如果没有beginPath&#xff0c;就会从原点重新开始 2.beginPath相当于让画笔从原点抬起&#xff0c;重新开始一个新路径&#xff0c;不重复走之前的路径&#xff0c;所以不会覆盖之前的路径 3.closePat…