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


    这是我写的组件,

    父组件代码:

    子组件代码:

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

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

    问:

    还是报错

    回答:

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

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

    1. <template>
    2. <div>
    3. <a @click="showDialog">点击打开 Dialoga>
    4. <div class="wrapper" :class="{ 'dialog-style': !hideOrshowItem }">div>
    5. <div class="white-box" :class="{ 'dialog-style': !hideOrshowItem }">
    6. <div class="headline">
    7. <span>{{ props.title }}span>
    8. <svg
    9. t="1697281987826"
    10. class="icon"
    11. viewBox="0 0 1024 1024"
    12. version="1.1"
    13. xmlns="http://www.w3.org/2000/svg"
    14. p-id="4001"
    15. xmlns:xlink="http://www.w3.org/1999/xlink"
    16. width="14"
    17. height="14"
    18. @click="closeAlert()"
    19. >
    20. <path
    21. 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"
    22. p-id="4002"
    23. fill="#bfbfbf"
    24. >path>
    25. svg>
    26. div>
    27. <div class="text">{{ props.text }}div>
    28. <div class="footer">
    29. <button class="btn" @click="clickButton">取消button>
    30. <button class="btn" @click="clickButton">确定button>
    31. div>
    32. div>
    33. div>
    34. template>

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

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

    问:

    打印出来结果一直是true

    回答:

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

    修改后的代码示例如下:

    1. <template>
    2. <div>
    3. <a @click="showDialog">点击打开 Dialoga>
    4. <div class="wrapper" :class="{ 'dialog-style': !hideOrshowItem }">div>
    5. <div class="white-box" :class="{ 'dialog-style': !hideOrshowItem }">
    6. <div class="headline">
    7. <span>{{ props.title }}span>
    8. <svg
    9. t="1697281987826"
    10. class="icon"
    11. viewBox="0 0 1024 1024"
    12. version="1.1"
    13. xmlns="http://www.w3.org/2000/svg"
    14. p-id="4001"
    15. xmlns:xlink="http://www.w3.org/1999/xlink"
    16. width="14"
    17. height="14"
    18. @click="closeAlert()"
    19. >
    20. <path
    21. 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"
    22. p-id="4002"
    23. fill="#bfbfbf"
    24. >path>
    25. svg>
    26. div>
    27. <div class="text">{{ props.text }}div>
    28. <div class="footer">
    29. <button class="btn" @click="clickButton">取消button>
    30. <button class="btn" @click="clickButton">确定button>
    31. div>
    32. div>
    33. div>
    34. 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的值:

    1. <script>
    2. import ChildComponent from "@/components/ChildComponent.vue";
    3. export default {
    4. components: {
    5. ChildComponent,
    6. },
    7. data() {
    8. return {
    9. hideOrshowItem: true,
    10. };
    11. },
    12. methods: {
    13. updateHideOrshowItem(value) {
    14. this.hideOrshowItem = value;
    15. },
    16. toggleHideOrshowItem() {
    17. this.hideOrshowItem = !this.hideOrshowItem;
    18. },
    19. },
    20. };
    21. script>

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

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

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

  • 相关阅读:
    DataBinding原理
    推理引擎之模型压缩浅析
    第五章、实现Web适配器
    【web前端】CSS第二天
    草莓病害图像数据集(YOLO使用,train为655张照片和val为487张照片)
    python自动爬取,保存并运行程序。
    Linux运维技能图谱
    工业交换机选购标准,你知道多少?
    shiro基于cookie多服务器共享session,坑记录
    iOS支付时出现Unknow错误的问题
  • 原文地址:https://blog.csdn.net/kuang_nu/article/details/133909900