vue中函数回调传值

在业务开发中,有时候会碰到一种情况:组件内部会触发一些事件用来请求新的数据,数据请求到后将新的数据继续在组件内进行处理。这个场景我们有三种方式可以实现它:

  1. 将数据请求写在组件内部,缺点不好维护,违反了单项数据流的原则。
  2. 通常我们可以通过this.$emit() 将事件传递到父组件中,让父组件请求数据,然后再传值给子组件,子组件拿到数据后进行下一步处理。适用大部分场景。
  3. 在父组件中写一个数据请求的函数,形参为回调,父组件将数据请求拿到后,通过传参传递给子组件,子组件通过传递过来的函数进行回调,从而进一步处理数据。

我们重点讨论第三种方式。


父组件:

<t-cascader
 :source="source"
 :loadData="loadData">
</t-cascader>
methods: {
    loadData(node, callback) {
        let {name, id, parent_id} = node
        this.ajax(id).then(result => {
            callback(result)
        })
    },
    ajax(parent_id = 0) {
        return new Promise((resolve, reject) => {
            setTimeout(()=>{
                let result = db.filter(item => item.parent_id == parent_id)
                resolve(result)
            }, 1000)
        })
    },
}

子组件:

props: {
    source: {
        type: Array
    },
    loadData: {
        type: Function,
    }
},
methods: {
    updateSelected(newItem) {
        this.$emit('update:selected', newItem)
        let lastItem = newItem[newItem.length - 1]
        // 上面是业务代码片段
        this.loadData(lastItem, result => {
            let last = this.source.filter(item => item.id === lastItem.id)[0]
            this.$set(last, "children", result)
        })// 将监听的值回调出去
    }
}

我们通过this.loadData() 函数 将父组件中的请求数据通过函数第二个形参callback回调的形式传给子组件中,从而正好衔接子组件业务代码传递给this.loadData() 函数的第一个参数。请求回来后的值继续在callback中进行处理,从而在写法上看上去像同步代码,代码更简单。

并且可将子组件作为一个独立的空间封装起来,需要使用时只需在父组件中命名一个调用数据请求的函数作为值传给子组件即可。

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3,可以通过以下几种方式实现点击事件传参: 1. 使用箭头函数定义click事件的回调函数,将需要传递的参数作为箭头函数的参数。例如,在模板定义一个click事件,并将需要传递的参数作为参数传递给回调函数: ```html <template> <div> <button @click="handleClick(item)">点击按钮</button> </div> </template> <script> export default { data() { return { item: { id: 1, name: 'example' } } }, methods: { handleClick(item) { console.log(item); // 在这里可以对item进行操作或者触发其他操作 } } } </script> ``` 这样,当点击按钮时,会将item作为参数传递给handleClick方法。 2. 使用自定义事件来传递参数。在setup函数,可以通过使用emit来触发自定义事件,并将需要传递的参数作为emit的第二个参数。例如: ```javascript import { ref, onMounted } from 'vue'; export default { setup() { const item = ref({ id: 1, name: 'example' }); const handleClick = () => { emit('select', item.value); }; return { handleClick }; } }; ``` 这样,在模板可以使用自定义事件select,并将item作为参数传递给它。例如: ```html <template> <div> <button @click="handleClick">点击按钮</button> </div> </template> <script> export default { emits: ['select'], setup(props, { emit }) { const item = { id: 1, name: 'example' }; const handleClick = () => { emit('select', item); }; return { handleClick }; } } </script> ``` 在这个例子,当点击按钮时,会触发自定义事件select,并将item作为参数传递给它。 总结一下,在Vue 3,可以通过箭头函数定义click事件的回调函数,将需要传递的参数作为箭头函数的参数,或者使用自定义事件来传递参数。这样就可以实现在点击事件传递参数的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值