如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?相关的知识,希望对你有一定的参考价值。

我正在尝试将属性(位于对象数组的第一个位置内)传递给另一个模块,以便稍后使用此值。我试图将它作为模块(args)传递,但它一直在读取默认值为0.有没有办法做到这一点?

我试图实现一些React.context,但Bot框架模拟器拒绝它。

/////////////////Module that ll acquire the value/////////////////////////////
    getCard(bot, builder, params) {
        let configValues = { ...params[0] }

        bot.dialog(`${configValues.path}`, function (session) {
            var msg = new builder.Message(session);

            const cardItem = (obj) => {
                return (new builder.HeroCard(session)
                    .title(`${obj.title}`)
                    .text(`R$ ${obj.price}`)
                    .images([builder.CardImage.create(session, `${obj.img}`)])
                    .buttons([
                        builder.CardAction.imBack(session, `${obj.price} Item adicionado!`, 'add to cart')
                        // !onClick event must add the current obj.price to 
                        // the configValues.total(Ex: configValues.total += obj.price)!
                    ])
                )
            }
            msg.attachmentLayout(builder.AttachmentLayout.carousel)
            msg.attachments(
                eval(params.map(obj => cardItem(obj)))
            );
            //!in here before end the dialog is where i want to update
// the configValues.total so i can show it in the -> Checkout module
            session.send(msg).endDialog()
        }).triggerAction({ matches: configValues.regex });
    }
}
//////////////CheckOut.Module///////////////////////////////
{...}
let configValues = { ...params[0] }
    let state = {
        nome: "",
        endereco: "",
        pagamento: "",
        total: configValues.total // this is the value to be read
    }

    bot.dialog('/intent', [
        {...},
        (session, results) => {
            state.pagamento = results.response
            session.send(
                JSON.stringify(state) // here is the place to be printed
            )
        {...}   
    ]
    ).triggerAction({ matches: /^(finalizar|checar|encerrar|confirmar pedido|terminar)/i })

答案

既然你解决了原来的问题,我会在你的评论中回答。

你的问题在这里:

cartId.map((obj, i , arr) => {
            // if (!obj.total) {
            //     obj.total.reduce(i => i += i)
            // }
            const newtotal = new total
            newtotal.getTotals(bot, builder, obj, arr)
        })

cartId包含每个项目的总计。当你在它上面调用map时,你将每个项目单独传递给getTotals,它将每个项目传递给checkout()

你不能将所有总数相加并且只能将一个项目的总和相加的原因是你将cartId传递给checkout并且cartId已被更改为单个项目。相反,你可以做几件不同的事情:

  1. cartId传递整个cartItems并在for (var key in cartItems)totalConstructor()中使用类似checkoutConstructor()的东西。这可能是最简单的,但内存效率不高。
  2. 使用BotBuilder's State Storage将你的totals数组存储在userData中,然后在最后加上它。这可能更难以实施,但将是一条更好的路线。 Here's a sample可以帮助您入门。

以上是关于如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?的主要内容,如果未能解决你的问题,请参考以下文章

包含 Context.Provider 和 Context.Consumer 的 React Context 测试组件

包含Context.Provider和Context.Consumer的反应上下文测试组件

如何使用 Next.js 仅将一些页面包装在 Context Provider 中?

React中不常用的功能——Context

为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用

React Context Provider forceupdate Video Element 播放视频