Dash 2.9.0版本重磅新功能来啦

简介: Dash 2.9.0版本重磅新功能来啦

1 允许多个回调函数重复Output

在之前版本的Dash中,严格限制了不同的回调函数不可以对相同的id.属性目标进行输出,以下面的示例应用为例:

import dash
from dash import html
import feffery_antd_components as fac
from dash.dependencies import Input, Output
app = dash.Dash(__name__)
app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                fac.AntdButton(
                    '按钮1',
                    id='button-demo1'
                ),
                fac.AntdButton(
                    '按钮2',
                    id='button-demo2'
                )
            ]
        ),
        fac.AntdParagraph(
            id='output-demo'
        )
    ],
    style={
        'padding': '50px 100px'
    }
)
@app.callback(
    Output('output-demo', 'children'),
    Input('button-demo1', 'nClicks'),
    prevent_initial_call=True
)
def trigger1(nClicks):
    return f'按钮1: {nClicks}'
@app.callback(
    Output('output-demo', 'children'),
    Input('button-demo2', 'nClicks'),
    prevent_initial_call=True
)
def trigger2(nClicks):
    return f'按钮2: {nClicks}'
if __name__ == '__main__':
    app.run(debug=True)

如果我们希望两个AntdButton分别点击后,可以通过两个不同的回调函数对同一AntdPargraph的内容进行输出,在之前的版本中默认会报下图所示的Duplicate callback outputs错误:

在之前的版本中遇到这种情况解决方式也有很多,常用的如将多个回调函数整合为一个并在回调函数中,再基于dash.ctx.triggered_id判断每次回调函数究竟是由哪个Input触发的,这在较复杂回调功能的编写中就不太方便了。

而从Dash 2.9.0版本开始,为Output()引入了bool型新参数allow_duplicate,默认为False,当设置为True后,当前Output便可以允许通过多个回调函数共同输出,将上面的例子回调部分进行改造,对后续重复的Output设置allow_duplicate=True

@app.callback(
    Output('output-demo', 'children', allow_duplicate=True),
    Input('button-demo2', 'nClicks'),
    prevent_initial_call=True
)
def trigger2(nClicks):
    return f'按钮2: {nClicks}'

就可以不受限制啦~

当然,虽然有了这个新特性帮助我们解除了不少限制,但是我的建议还是不要滥用,它不一定可以使得我们的代码更简洁,基于dash.ctx.triggered_id的分支判断在很多场景下还是更合适。

作为一个新的功能,allow_duplicate目前在常规的服务端回调函数中运作正常,但在浏览器端回调函数中暂时无法使用,静待后续Dash官方的更新。

2 新增Patch()操作模式

Dash 2.9.0版本中新增参数局部快捷更新操作Patch(),使得我们可以在回调函数中对目标属性进行局部更新,这样说起来还是比较抽象,我们举例说明:

假如我们的应用中要实现这样的交互逻辑:每点击一次AntdButton,就会在下方AntdSpace中新增一行文字内容,在「以前」的版本中,要实现这个功能,我们需要在回调函数中额外将目标AntdSpacechildren属性作为State传入,从而在每次回调执行时,将新的一行内容追加到先前状态的children列表中,再进行输出:

import dash
import uuid
from dash import html
import feffery_antd_components as fac
from dash.dependencies import Input, Output, State
app = dash.Dash(__name__)
app.layout = html.Div(
    [
        fac.AntdButton(
            '新增一行',
            id='add-new-line'
        ),
        fac.AntdSpace(
            [],
            id='target-container',
            direction='vertical',
            style={
                'width': '100%'
            }
        )
    ],
    style={
        'padding': '50px 100px'
    }
)
@app.callback(
    Output('target-container', 'children'),
    Input('add-new-line', 'nClicks'),
    State('target-container', 'children'),
    prevent_initial_call=True
)
def add_new_line(nClicks, origin_children):
    return [
        *origin_children,
        str(uuid.uuid4())
    ]
if __name__ == '__main__':
    app.run(debug=True)

这样做的弊端很明显——我们每次更新都需要先取回目标属性的现有状态,这带来了多余的资源消耗,而有了Patch()模式,我们就可以将回调函数改写为下面的形式,实现相同的效果:

@app.callback(
    Output('target-container', 'children'),
    Input('add-new-line', 'nClicks'),
    prevent_initial_call=True
)
def add_new_line(nClicks):
    patch = dash.Patch()
    patch.append(str(uuid.uuid4()))
    return patch

相当于在回调函数中通过实例化Patch,创建了针对目标Output的远程代理对象,在回调函数中针对该代理对象的各种常用操作,都会在回调函数执行后落实到用户浏览器中的目标属性上,这听起来可能有些抽象,我用下面的例子展示了基于Patch可以实现的常用局部值操作(对应代码受篇幅限制,请在文章开头的github仓库中查看):

相关文章
|
4月前
|
IDE 小程序 API
【社区每周】IDE 3.8.10 Beta 版新增按需编译功能(1月第四期)
【社区每周】IDE 3.8.10 Beta 版新增按需编译功能(1月第四期)
53 6
|
4月前
|
小程序 IDE 开发工具
【社区每周】AMPE新版本发布(12月第三期)
【社区每周】AMPE新版本发布(12月第三期)
45 6
|
4月前
|
小程序 IDE 开发工具
社区每周丨IDE 3.7.4 Beta 版本上线及基础库更新至 2.8.10(6.5-6.9)
社区每周丨IDE 3.7.4 Beta 版本上线及基础库更新至 2.8.10(6.5-6.9)
76 11
|
4月前
|
小程序 IDE 开发工具
社区每周丨基础库更新至 2.8.8及IDE3.6.3 Beta 版本上线(4.3-4.7)
社区每周丨基础库更新至 2.8.8及IDE3.6.3 Beta 版本上线(4.3-4.7)
65 11
|
4月前
|
小程序 IDE JavaScript
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
54 0
|
4月前
|
IDE 小程序 开发工具
【社区每周】IDE 3.2 Beta版发布,支持添加版本备注(2022年9月第四期)
【社区每周】IDE 3.2 Beta版发布,支持添加版本备注(2022年9月第四期)
46 0
|
人工智能 搜索推荐 定位技术
CorelDRAW2023新版本有哪些全新的亮点?
CorelDRAW作为一款专业的平面设计软件,拥有着庞大的用户群体,而每年春天CorelDRAW新版本的发布也牵动着每一位小伙伴的心。今年也不例外,最近一个月来,网上爆料了很多CorelDRAW新版本的消息,而现在CorelDRAW终于传来了好消息—2023年3月即将发布全新版本,那本次的新版本会有哪些不一样又有哪些新功能呢?我们一起来预测一下吧。
197 0
|
iOS开发 MacOS Windows
FL Studio 21是最新发布的版本 其主要的新功能有哪些?
FL Studio 21是最新发布的版本 其主要的新功能有哪些?
99 0
|
搜索推荐
Boom3D软件2023最新版本有哪些新功能特色?
为了更好地感受音乐的魅力,Boom 3D 可以让你对音效进行个性化增强,并集成 3D 环绕立体声效果,可以让你在使用任何耳机时,都拥有纯正、优质的音乐体验。Boom 3D是一款充满神奇魅力的3D环绕音效升级版,BOOM 3D是一个全新的专业音频应用程序,提供丰富和强烈的音频与3D环绕声音,让耳机的声音更好!文件大小为40.65 MB,适用系统为WinXP/Win7/Win10/Win All,以下为介绍或使用方法。
311 0
|
人工智能
Adobe2023升级版发布更新功能介绍
Adobe 2023全家桶已发布。Adobe 2022还没保存的。可以抓紧保存最后一波了。今天给大家带来了。Adobe 2023最新稳定版。WIN系统+MAC系统+M1系统。
328 0