//127.0.0.1:8050/ in your web browser. from dash import Dash, html, dcc import plotly.express as px import pandas as pd app = Dash[__name__] # assume you have a "long-form" data frame # see //plotly.com/python/px-arguments/ for more options df = pd.DataFrame[{ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], "Amount": [4, 1, 2, 2, 4, 5], "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"] }] fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"] app.layout = html.Div[children=[ html.H1[children='Hello Dash'], html.Div[children=''' Dash: A web application framework for your data. '''], dcc.Graph[ id='example-graph', figure=fig ] ]] if __name__ == '__main__': app.run_server[debug=True]
Xin chào Dash
Dash: Một khung ứng dụng web cho dữ liệu của bạn.
$ python app.py
...Running on //127.0.0.1:8050/ [Press CTRL+C to quit]
Truy cập //127.0.0.1:8050/ trong trình duyệt web của bạn. Bạn sẽ thấy một ứng dụng trông giống như ở trên.
in your web browser. You should see an app that looks like the one above.
Note:
- 7 bao gồm một cây của các thành phần của người Hồi giáo, chẳng hạn như 8 và 9.
8
and 9. Mô -đun thành phần HTML Dash [
0]Có một thành phần cho mỗi thẻ HTML. Thành phần
1 tạo ra phần tử 2 HTML trong ứng dụng của bạn. 3. Không phải tất cả các thành phần là HTML thuần túy. Mô-đun thành phần lõi Dash [3] chứa các thành phần cấp cao hơn tương tác và được tạo bằng JavaScript, HTML và CSS thông qua thư viện React.js.
The 1
component generates a 2 HTML element in your application.
3. Not all components are pure HTML.
The Dash Core Components module [3]
contains higher-level components that are interactive and are generated with
JavaScript, HTML, and CSS through the React.js library.Mỗi thành phần được mô tả hoàn toàn thông qua các thuộc tính từ khóa. Dash là khai báo: Bạn sẽ chủ yếu mô tả ứng dụng của mình thông qua các thuộc tính này.
Dash is declarative: you will primarily describe your application
through these attributes.- Tài sản 4 là đặc biệt. Theo quy ước, nó luôn luôn là thuộc tính đầu tiên có nghĩa là bạn có thể bỏ qua nó: 1 giống như 6. Nó có thể chứa một chuỗi, một số, một thành phần duy nhất hoặc danh sách các thành phần.
- Các phông chữ trong ứng dụng của bạn sẽ trông hơi khác một chút so với những gì được hiển thị ở đây. Ứng dụng này đang sử dụng Bộ thiết kế kiểu CSS tùy chỉnh và Dash Enterprise Design để sửa đổi các kiểu mặc định của các yếu tố. Bạn có thể tìm hiểu thêm về CSS tùy chỉnh trong hướng dẫn CSS.
This application is using a custom CSS stylesheet and Dash Enterprise Design Kit
to modify the default styles of the elements. You can learn more about custom CSS in the
CSS tutorial.
Thực hiện thay đổi đầu tiên của bạn
Dash bao gồm tải nóng nóng, các tính năng này được kích hoạt theo mặc định khi bạn chạy ứng dụng của mình với ____37. Điều này có nghĩa là Dash sẽ tự động làm mới trình duyệt của bạn khi bạn thực hiện thay đổi mã của mình.
you run your app with
This means that Dash
will automatically refresh your browser when you make a change in your code.
Hãy thử: Thay đổi tiêu đề Hello Hello Dash trong ứng dụng của bạn hoặc thay đổi dữ liệu
8 hoặc 9. Ứng dụng của bạn nên tự động tái phát với sự thay đổi của bạn.8 or the 9 data. Your app should auto-refresh with your change.
Bạn có thích tải nóng không? Bạn có thể tắt nó với ____40. Tìm hiểu thêm trong câu hỏi tài liệu công cụ Dash Dev? Xem Diễn đàn Cộng đồng Thảo luận tải lại nóng.
Learn more in Dash Dev Tools documentation
Questions? See the community forum hot reloading discussion.
Thêm về các thành phần HTML
Các thành phần HTML Dash [
0] chứa một lớp thành phần cho mọi thẻ HTML cũng như các đối số từ khóa cho tất cả các đối số HTML.contains a component class for every HTML tag as well as keyword arguments for all of the HTML arguments.
Hãy để tùy chỉnh văn bản trong ứng dụng của chúng tôi bằng cách sửa đổi các kiểu nội tuyến của các thành phần. Tạo một tệp có tên
pip install dash-bootstrap-components
2 với mã sau:Create a file named
pip install dash-bootstrap-components
2 with the following code:# Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, dcc, html
import plotly.express as px
import pandas as pd
app = Dash[__name__]
colors = {
'background': '#111111',
'text': '#7FDBFF'
}
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
fig.update_layout[
plot_bgcolor=colors['background'],
paper_bgcolor=colors['background'],
font_color=colors['text']
]
app.layout = html.Div[style={'backgroundColor': colors['background']}, children=[
html.H1[
children='Hello Dash',
style={
'textAlign': 'center',
'color': colors['text']
}
],
html.Div[children='Dash: A web application framework for your data.', style={
'textAlign': 'center',
'color': colors['text']
}],
dcc.Graph[
id='example-graph-2',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
Xin chào Dash
Dash: Một khung ứng dụng web cho dữ liệu của bạn.
Truy cập //127.0.0.1:8050/ trong trình duyệt web của bạn. Bạn sẽ thấy một ứng dụng trông giống như ở trên.
and
pip install dash-bootstrap-components
4components with the pip install dash-bootstrap-components
5 property.html.H1['Hello Dash', style={'textAlign': 'center', 'color': '#7FDBFF'}]
7 bao gồm một cây của các thành phần của người Hồi giáo, chẳng hạn như 8 và 9.2.
Mô -đun thành phần HTML Dash [
0]and the HTML attributes:
- Có một thành phần cho mỗi thẻ HTML. Thành phần 1 tạo ra phần tử 2 HTML trong ứng dụng của bạn. 3. Không phải tất cả các thành phần là HTML thuần túy. Mô-đun thành phần lõi Dash [3] chứa các thành phần cấp cao hơn tương tác và được tạo bằng JavaScript, HTML và CSS thông qua thư viện React.js.
you can just supply a dictionary. - Mỗi thành phần được mô tả hoàn toàn thông qua các thuộc tính từ khóa. Dash là khai báo: Bạn sẽ chủ yếu mô tả ứng dụng của mình thông qua các thuộc tính này.
So, instead of
0, it’simport dash import dash_bootstrap_components as dbc app = dash.Dash[ external_stylesheets=[dbc.themes.BOOTSTRAP] ] app.layout = dbc.Alert[ "Hello, Bootstrap!", className="m-5" ] if __name__ == "__main__": app.run_server[]
1.import dash import dash_bootstrap_components as dbc app = dash.Dash[ external_stylesheets=[dbc.themes.BOOTSTRAP] ] app.layout = dbc.Alert[ "Hello, Bootstrap!", className="m-5" ] if __name__ == "__main__": app.run_server[]
- Tài sản 4 là đặc biệt. Theo quy ước, nó luôn luôn là thuộc tính đầu tiên có nghĩa là bạn có thể bỏ qua nó: 1 giống như 6. Nó có thể chứa một chuỗi, một số, một thành phần duy nhất hoặc danh sách các thành phần.
- Các phông chữ trong ứng dụng của bạn sẽ trông hơi khác một chút so với những gì được hiển thị ở đây. Ứng dụng này đang sử dụng Bộ thiết kế kiểu CSS tùy chỉnh và Dash Enterprise Design để sửa đổi các kiểu mặc định của các yếu tố. Bạn có thể tìm hiểu thêm về CSS tùy chỉnh trong hướng dẫn CSS.
argument. By convention, this is always the first argument and so it is often omitted.
Thực hiện thay đổi đầu tiên của bạn
to you within your Python context.
Dash bao gồm tải nóng nóng, các tính năng này được kích hoạt theo mặc định khi bạn chạy ứng dụng của mình với ____37. Điều này có nghĩa là Dash sẽ tự động làm mới trình duyệt của bạn khi bạn thực hiện thay đổi mã của mình.
Hãy thử: Thay đổi tiêu đề Hello Hello Dash trong ứng dụng của bạn hoặc thay đổi dữ liệu
8 hoặc 9. Ứng dụng của bạn nên tự động tái phát với sự thay đổi của bạn.Bạn có thích tải nóng không? Bạn có thể tắt nó với ____40. Tìm hiểu thêm trong câu hỏi tài liệu công cụ Dash Dev? Xem Diễn đàn Cộng đồng Thảo luận tải lại nóng.
Pandas dataframe. Create a file named
pip install dash-bootstrap-components
2 with the following code:0
Thêm về các thành phần HTML
tiểu bang | 1390.63 | 34.4 | 10.6 | 481.0 | 4.06 | 8.0 | 17.1 | 25.11 | 5.5 | 8.9 | 14.33 | 34.9 | 70.0 | 317.61 | |
1 | Tổng xuất khẩu | 13.31 | 0.2 | 0.1 | 0.19 | 0.6 | 1.0 | 1.56 | |||||||
2 | thịt bò | 1463.17 | 71.3 | 17.9 | 105.48 | 19.3 | 41.0 | 60.27 | 147.5 | 239.4 | 386.91 | 7.3 | 48.7 | 423.95 | |
3 | thịt lợn | 3586.02 | 53.2 | 29.4 | 562.9 | 3.53 | 2.2 | 4.7 | 6.88 | 4.4 | 7.1 | 11.45 | 69.5 | 114.5 | 665.44 |
4 | gia cầm | 16472.88 | 228.7 | 11.1 | 225.4 | 929.95 | 2791.8 | 5944.6 | 8736.4 | 803.2 | 1303.5 | 2106.79 | 34.6 | 249.3 | 1064.95 |
5 | Colorado | 1851.33 | 261.4 | 66.0 | 14.0 | 71.94 | 5.7 | 12.2 | 17.99 | 45.1 | 73.2 | 118.27 | 183.2 | 400.5 | |
6 | Connecticut | 259.62 | 1.1 | 0.1 | 6.9 | 9.49 | 4.2 | 8.9 | 13.1 | 4.3 | 6.9 | 11.16 | |||
7 | Del biết | 282.19 | 0.4 | 0.6 | 114.7 | 2.3 | 0.5 | 1.0 | 1.53 | 7.6 | 12.4 | 20.03 | 26.9 | 22.9 | |
8 | Florida | 3764.09 | 42.6 | 0.9 | 56.9 | 66.31 | 438.2 | 933.1 | 1371.36 | 171.9 | 279.0 | 450.86 | 3.5 | 1.8 | 78.24 |
9 | Georgia | 2860.84 | 31.0 | 18.9 | 630.4 | 38.38 | 74.6 | 158.9 | 233.51 | 59.0 | 95.8 | 154.77 | 57.8 | 65.4 | 1154.07 |
Thêm về trực quan
Mô -đun thành phần lõi Dash [
3] bao gồm một thành phần gọi làimport dash
import dash_bootstrap_components as dbc
app = dash.Dash[
external_stylesheets=[dbc.themes.BOOTSTRAP]
]
app.layout = dbc.Alert[
"Hello, Bootstrap!", className="m-5"
]
if __name__ == "__main__":
app.run_server[]
8.module [3] includes a component called
import dash
import dash_bootstrap_components as dbc
app = dash.Dash[
external_stylesheets=[dbc.themes.BOOTSTRAP]
]
app.layout = dbc.Alert[
"Hello, Bootstrap!", className="m-5"
]
if __name__ == "__main__":
app.run_server[]
8.import dash
import dash_bootstrap_components as dbc
app = dash.Dash[
external_stylesheets=[dbc.themes.BOOTSTRAP]
]
app.layout = dbc.Alert[
"Hello, Bootstrap!", className="m-5"
]
if __name__ == "__main__":
app.run_server[]
8 hiển thị trực quan hóa dữ liệu tương tác bằng cách sử dụng thư viện đồ thị JavaScript nguồn mở. Plotly.js hỗ trợ hơn 35 loại biểu đồ và hiển thị biểu đồ trong cả SVG chất lượng vector và WebGL hiệu suất cao.renders interactive data visualizations using the open source
plotly.js JavaScript graphing
library. Plotly.js supports over 35 chart types and renders charts in
both vector-quality SVG and high-performance WebGL.
Đối số
# Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
0 trong thành phần ____58 là đối số # Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
0 giống nhau được sử dụng bởi # Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
3, thư viện đồ thị Python nguồn mở Plotly. Kiểm tra tài liệu và thư viện Plotly.py để tìm hiểu thêm.component is the same
# Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
0
argument that is used by # Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
3, Plotly’sopen source Python graphing library.
Check out the plotly.py documentation and gallery
to learn more.
Dưới đây, một ví dụ tạo ra một âm mưu phân tán từ khung dữ liệu gấu trúc. Tạo một tệp có tên
pip install dash-bootstrap-components
2 với mã sau:Pandas dataframe. Create a file named
pip install dash-bootstrap-components
2 with the following code:1
Các biểu đồ này là tương tác và phản hồi. Nhìn qua các điểm để xem các giá trị của chúng, nhấp vào các mục huyền thoại để chuyển đổi dấu vết, nhấp và kéo để phóng to, giữ Shift và nhấp và kéo đến Pan.
Hover over points to see their values,
click on legend items to toggle traces,
click and drag to zoom,
hold down shift, and click and
drag to pan.
Đánh dấu
Mặc dù Dash phơi bày HTML thông qua các thành phần HTML DASH [
0], nhưng có thể tẻ nhạt khi viết bản sao của bạn trong HTML. Để viết các khối văn bản, bạn có thể sử dụng thành phần# Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
6 trong các thành phần lõi Dash [3]. Tạo một tệp có tên pip install dash-bootstrap-components
2 với mã sau:# Run this app with `python app.py` and
# visit //127.0.0.1:8050/ in your web browser.
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd
app = Dash[__name__]
# assume you have a "long-form" data frame
# see //plotly.com/python/px-arguments/ for more options
df = pd.DataFrame[{
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
}]
fig = px.bar[df, x="Fruit", y="Amount", color="City", barmode="group"]
app.layout = html.Div[children=[
html.H1[children='Hello Dash'],
html.Div[children='''
Dash: A web application framework for your data.
'''],
dcc.Graph[
id='example-graph',
figure=fig
]
]]
if __name__ == '__main__':
app.run_server[debug=True]
6 component inDash Core Components [3]. Create a file named
pip install dash-bootstrap-components
2 with the following code:2
Dash và Markdown
Ứng dụng Dash có thể được viết bằng Markdown. Dash sử dụng đặc tả Commonmark của Markdown. Kiểm tra hướng dẫn đánh dấu 60 giây của họ nếu đây là phần giới thiệu đầu tiên của bạn về Markdown!
Dash uses the CommonMark
specification of Markdown.
Check out their 60 Second
Markdown Tutorial
if this is your first introduction to Markdown!
Thành phần cốt lõi
Các thành phần lõi Dash [
3] bao gồm một tập hợp các thành phần cấp cao hơn như thả xuống, đồ thị, khối đánh dấu, v.v.includes a set of higher-level components like dropdowns, graphs, markdown blocks, and more.
Giống như tất cả các thành phần Dash, chúng được mô tả hoàn toàn khai báo. Mỗi tùy chọn có thể định cấu hình đều có sẵn dưới dạng đối số từ khóa của thành phần.
Every option that is configurable is available as a keyword argument
of the component.
Chúng tôi sẽ thấy nhiều thành phần này trong suốt hướng dẫn. Bạn có thể xem tất cả các thành phần có sẵn trong bộ sưu tập các thành phần cốt lõi Dash.
You can
view all of the available components in the
Dash Core Components Gallery.
Dưới đây là một vài thành phần có sẵn. Tạo một tệp có tên
pip install dash-bootstrap-components
2 với mã sau:Create a file named
pip install dash-bootstrap-components
2 with the following code:3
Thả xuống
Thả xuống đa lựa chọn
Các mặt hàng radio
Hộp kiểm
Đầu vào văn bản
Thanh trượt
Cứu giúp
Các thành phần Dash được khai báo: Mọi khía cạnh có thể định cấu hình của các thành phần này được đặt trong quá trình khởi tạo làm đối số từ khóa.
components is set during instantiation as a keyword argument.
Gọi
$ python app.py
...Running on //127.0.0.1:8050/ [Press CTRL+C to quit]
1 trong bảng điều khiển Python của bạn trên bất kỳ thành phần nào để tìm hiểu thêm về một thành phần và các đối số có sẵn của nó.learn more about a component and its available arguments.
4
Bản tóm tắt
7 của ứng dụng Dash mô tả ứng dụng này trông như thế nào. 7 là một cây các thành phần phân cấp.The 7 is a hierarchical tree of components.
Các thành phần HTML Dash [
0] cung cấp các lớp cho tất cả các thẻ HTML và các đối số từ khóa mô tả các thuộc tính HTML nhưpip install dash-bootstrap-components
5, import dash
import dash_bootstrap_components as dbc
app = dash.Dash[
external_stylesheets=[dbc.themes.BOOTSTRAP]
]
app.layout = dbc.Alert[
"Hello, Bootstrap!", className="m-5"
]
if __name__ == "__main__":
app.run_server[]
2 và $ python app.py
...Running on //127.0.0.1:8050/ [Press CTRL+C to quit]
7. Các thành phần lõi Dash [3] tạo ra các thành phần cấp cao hơn như điều khiển và đồ thị.tags and the keyword arguments describe the HTML attributes like
pip install dash-bootstrap-components
5, import dash
import dash_bootstrap_components as dbc
app = dash.Dash[
external_stylesheets=[dbc.themes.BOOTSTRAP]
]
app.layout = dbc.Alert[
"Hello, Bootstrap!", className="m-5"
]
if __name__ == "__main__":
app.run_server[]
2, and $ python app.py
...Running on //127.0.0.1:8050/ [Press CTRL+C to quit]
7. Dash Core Components [3] generates higher-level components like
controls and graphs.Để tham khảo, xem:
- Bộ sưu tập thành phần cốt lõi Dash
- Bộ sưu tập linh kiện HTML Dash
Phần tiếp theo của hướng dẫn Dash bao gồm cách làm cho các ứng dụng này tương tác. Hướng dẫn Dash Phần 3: Gọi lại cơ bản
Dash Tutorial Part 3: Basic Callbacks