Dash 2.9.0版本重磅新功能一览
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/dash-master
大家好我是费老师,就在昨晚,Dash
框架发布了其2.9.0版本更新,在一众更新内容中,有两条新特性在我看来尤为重要,可以大幅度提升我们开发Dash
应用的效率,下面我就将带大家一起了解它们的具体内容:
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
中新增一行文字内容,在以前的版本中,要实现这个功能,我们需要在回调函数中额外将目标AntdSpace
的children
属性作为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
仓库中查看):
以上就是本文的全部内容,对Dash
应用开发感兴趣的朋友,欢迎添加微信号CNFeffery
,备注“dash学习”加入我的技术交流群,一起成长一起进步。
Dash 2.9.0版本重磅新功能一览的更多相关文章
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- (数据科学学习手札129)geopandas 0.10版本重要新特性一览
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...
- (数据科学学习手札139)geopandas 0.11版本重要新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...
- iOS14新功能一览
这是转载的6月份的一篇文章,但是和今天发布的 ios14 正式版基本一致,可以大概参考一下. 23 号凌晨的 WWDC ,小狐也是恪尽职守啊!从开场到收尾,小狐一点也没落下,整场大会围绕着 Apple ...
- Apache Hudi 0.8.0版本重磅发布
1. 重点特性 1.1 Flink集成 自从Hudi 0.7.0版本支持Flink写入后,Hudi社区又进一步完善了Flink和Hudi的集成.包括重新设计性能更好.扩展性更好.基于Flink状态索引 ...
- PHP5各个版本的新功能和新特性总结
因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...
- PHP5各个版本的新功能和新特性总结(转载 http://www.jb51.net/article/48150.htm)
本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredo ...
- Bash 5.0 发布及其新功能
导读 邮件列表证实最近发布了 Bash-5.0.而且,令人兴奋的是它还有新的功能和变量.如果你一直在使用 Bash 4.4.XX,那么你一定会喜欢 Bash 的第五个主要版本. 第五个版本侧重于新的 ...
- Android Studio 3.0 下载 使用新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- 干货来袭:Redis5.0支持的新功能说明
Redis5.0支持的新特性说明 本文内容来自华为云帮助中心 华为云DCS的Redis5.x版本继承了4.x版本的所有功能增强以及新的命令,同时还兼容开源Redis5.x版本的新增特性. Stream ...
随机推荐
- Flask的介绍、安装和使用
Flask的介绍 Flask其实就是Python-web中的一个框架,也就是说Flask是一个工具,提供了库和技术来让你建立一个web的应用程序.这个程序可以使一些web页面.博客.基于web的日历应 ...
- 启动anaconda的报错:There is an instance of anaconda navigator already running error
首先调出控制台(win+r,输入cmd),然后在控制台输入 tasklist | findstr "pythonw" 在显示出pythonw.exe后,找到其后面的pid(数字), ...
- 在Unity3D中开发的Dissolve Shader
Swordmaster Dissolve Shaders 特点 本插件共包含两种Dissolve Shader: (1).一种类型是Bumped Specular工作流的Dissolve Shader ...
- shell中产生随机字符串的方法
random变量 echo $RANDOM 8746 生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余. 再结合md5生成字符串 echo $RANDOM |md5s ...
- linux 基线检查
1 检查用户缺省UMASK #cat /etc/profile|sed '/^#/d'|sed '/^$/d'|grep -i "umask" 修改umask vi /etc/pr ...
- iOS 为 textView 添加 placeholder
OC : //自定义一个 placeholder 样式的 label UILabel *placeholder = [UILabel new]; placeholder.text = @"请 ...
- 操作系统|02.Linux基础(1)
Linux基础 1.Linux系统安装.密码的破解 1.1常见的系统 unix:性能稳定,价格高昂,命令与Linux相通.多为大型政府单位.大型企业.金融机构使用. Linux:开源.自由 Linux ...
- Linux命令之nc命令
1.简介 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉.nc命令在linux系统中实际命令是ncat,nc是软连接到ncat.nc命令的主要作用如下: 实现任意TCP/ ...
- CORS(cross origin resource sharing)
1.什么是CORS 定义:跨域资源共享. 2.什么是跨域资源共享 允许浏览器可以从当前源服务器通过ajax访问另外一个源服务地址. 3.同源策略 是浏览器的一个安全功能,不同源的客户端脚本在没有明确的 ...
- Unity学习笔记——坐标转换(2)
子物体与父物体 子物体与父物体的关系类似于人与地球的关系,地球无论自转还是公转,对于地球上的我们来说,前后左右的方向不会变,因此在Unity中当我们旋转或是移动父物体时,子物体跟随父物体变化,但tra ...