Vue+elementUI 从子组件返回父组件

Vue+elementUI 从子组件返回父组件

在前端开发中,我们经常会使用依托于主组件的子组件(可能只有我,因为我喜欢用抽屉来代替进入一个新页面),这样我们就会遇见一个问题:当我操作完子组件想返回父组件的时候,怎样关闭当前组件返回父组件呢?
在这里插入图片描述

比如图中这种情况,用户点击注册之后弹出左侧抽屉来供用户填写表单(可能主流方式是进入一个新的注册页面,但我更喜欢在当前页面用抽屉的形式实现(逃))

用户可能会有三种操作:1)点击立即创建按钮,进行相应处理之后然后根据后端返回值进行相应的成功操作(返回主页面)或者失败操作(比如提示网络断开创建失败);2)点击取消,返回主页面;3)点击空白区域(本页面中抽屉之外的部分),或者esc,或者其他类似操作返回主页面。

在elementUI中,对于(3)操作已经默认实现了(只要你用的是它的抽屉组件),所以我们需要实现的是(1)和(2)操作。

首先我们知道,这个子组件有一个属性叫visible,当其为真时,这个组件便是可见的,就像上图中的状态;当其为假时,便为下图中的状态:在这里插入图片描述

那我们便可以用一个变量registerFlag来表示当前抽屉是否可见,比如这样:

<el-drawer
      title="注册"
      :visible.sync="registerFlag"
      :direction="'ltr'"
      :before-close="handleClose">
      <register class="regis">
      </register>
    </el-drawer>

其中

:visible.sync="registerFlag"

这一句即可以实现通过修改registerFlag的值来控制子组件是否显示了(sync是同步修饰符,加上就完事了)。

但是我们就会遇到一个新问题:我在子组件里的时候是看不到父组件的呀,怎么操作这个在父组件里的变量呢!

我在第一次遇到这个问题的时候用我浅显的两三个小时的vue知识实现了通过传参来解决这个问题的方法。即通过props那一套,现在回头看十分愚蠢。

然后现在我又想到一种方法(说不定以后回来看也觉得很愚蠢):

先在主页写好一个函数比如叫childrenCancle(),里面实现具体的关闭子组件的操作比如this.registerFlag=false,然后将这个函数名传递到子组件中,在子组件用$emit()方法调用这个函数:

<el-drawer

      title="注册"
      :visible.sync="registerFlag"
      :direction="'ltr'"
      :before-close="handleClose">
      <register class="regis"
        @handleClose="childrenCancle">
          <!-- 这样就把父组件的childrenCancle函数传递到子组件中了,在子组件中使用时的名字叫handleClose,当然这里只是为了给大家区分清楚,在实际使用时可以叫一样的名字 -->
      </register>
    </el-drawer>

然后子组件中的关闭子组件的方法叫backHome()的话,在里面写一句this.$emit(“handleClose”)就可以了。

methods: {
    ...,
    backHome(){
      this.$emit("handleClose")
    }
    ...,
  },

Home(){
this.$emit(“handleClose”)
}
…,
},


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 组件向子组件传值: 在组件中使用子组件时,可以通过在子组件标签中使用属性绑定的方式将数据传递给子组件。例如: ```html <template> <div> <child-component :prop-name="parentData"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: '这是来自组件数据' }; } }; </script> ``` 在子组件中,可以通过 `props` 来接收组件传递过来的数据。例如: ```html <template> <div>{{ propName }}</div> </template> <script> export default { props: { propName: { type: String, required: true } } }; </script> ``` 2. 子组件组件传值: 在子组件中,可以通过 `$emit` 方法触发自定义事件,并将数据传递给组件。例如: ```html <template> <div> <button @click="sendDataToParent">向组件传递数据</button> </div> </template> <script> export default { methods: { sendDataToParent() { this.$emit('custom-event', '这是来自子组件数据'); } } }; </script> ``` 在组件中,可以通过在子组件标签中监听自定义事件的方式接收子组件传递过来的数据。例如: ```html <template> <div> <child-component @custom-event="receiveDataFromChild"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { receiveDataFromChild(data) { console.log(data); // 输出:这是来自子组件数据 } } }; </script> ``` 3. 组件互相传值: 可以将以上两种方式结合起来,实现组件互相传值。例如: ```html <template> <div> <child-component :prop-name="parentData" @custom-event="receiveDataFromChild"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: '这是来自组件数据' }; }, methods: { receiveDataFromChild(data) { console.log(data); // 输出:这是来自子组件数据 } } }; </script> ``` 子组件: ```html <template> <div> <button @click="sendDataToParent">向组件传递数据</button> </div> </template> <script> export default { props: { propName: { type: String, required: true } }, methods: { sendDataToParent() { this.$emit('custom-event', '这是来自子组件数据'); } } }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值