Writing gui programs with Rust                          
                                                                                                               
                                                 with Dioxus!                                                  
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                     Kyle                                                      
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                           Installation                                            
                                                                                                               
                                                                                                               
                                                                                                               
         ██ 首先請先安裝 Rust(https://rustup.rs/) 和 rust-analyzer                                                    
                                                                                                               
            •  記得要同意安裝 Visual Studio Prerequisites                                                             
            •  安裝完後要 重啟終端機 才可運行 cargo                                                                          
            •  在 VSCode 的擴充元件搜尋 rust-analyzer 即可安裝                                                             
                                                                                                               
         ██ 安裝 dioxus cli                                                                                      
                                                                                                               
         cargo install cargo-binstall                                                                    
            •  ``                                                                                              
         cargo binstall dioxus-cli 創建 App ===                                                            
                                                                                                               
         ██ dx new your_project                                                                                
                                                                                                               
            •  選擇 barebones                                                                                    
            •  不選擇 fullstack                                                                                   
            •  不選擇 Router                                                                                      
            •  選擇 Tailwind css                                                                                 
            •  選擇 Desktop                                                                                      
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         2 / 8 
                                                                                                               
                                                                                                               
                                                                                                               
                                            HTML 與 CSS                                               
                                                                                                               
                                                                                                               
                                                                                                               
         ██ HTML                                           ██ CSS                                              
                                                                                                               
            •  網頁的骨架                                          •  網頁的外觀                                         
            •  表示內容                                           •  表示使用者所互動的                                     
                                                                                                               
                                                                                                               
         ██ 結論                                                                                                 
                                                                                                               
            •  將內容放進 HTML                                                                                      
            •  再利用 CSS 將 HTML 變好看,變好用                                                                          
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         3 / 8 
                                                                                                               
                                                                                                               
                                                                                                               
                                               Template                                                
                                                                                                               
                                                                                                               
                                                                                                               
            •  利用 dx serve 編譯                                                                                  
                                                                                                               
                                                                                                               
                   use dioxus::prelude::*;                                                                     
                                                                                                               
                   fn main() {                                                                                 
                       dioxus::launch(App);                                                                    
                   }                                                                                           
                                                                                                               
                   #[component]                                                                                
                   fn App() -> Element {                                                                       
                       rsx! {                                                                                  
                           document::script { src: "                                                           
                   https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4" }                                      
                           Hero {}                                                                             
                                                                                                               
                       }                                                                                       
                   }                                                                                           
                                                                                                               
                   #[component]                                                                                
                   pub fn Hero() -> Element {                                                                  
                       rsx! {                                                                                  
                           div {                                                                               
                               class: "text-3xl",                                                              
                               "my text!"                                                                      
                           }                                                                                   
                       }                                                                                 4 / 8 
                   }                                                                                           
                                                                                                               
                                                                                                               
                                        HTML Cheatsheet                                         
                                                                                                               
                                                                                                               
                                                                                                               
         div 一個「元素」區塊,可以 nesting                                                                         
         button 類似 div,但可利用 onclick: move |_| { // code }                                                
         image 利用 href: {path} 嵌入照片                                                                      
            •  利用 class: "stuff" 撰寫 CSS                                                                        
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         5 / 8 
                                                                                                               
                                                                                                               
                                                                                                               
                          Dioxus Cheatsheet(properties)                           
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                   #[component]                                                                                
                   pub fn PrintName(name: String) -> Element {                                                 
                       rsx! {                                                                                  
                           div {                                                                               
                               class: "text-3xl",                                                              
                               "Hello my name is {name}!"                                                      
                           }                                                                                   
                       }                                                                                       
                   }                                                                                           
                   #[component]                                                                                
                   fn App() -> Element {                                                                       
                       rsx! {                                                                                  
                           document::Script { src: "                                                           
                   https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4" }                                      
                           PrintName { name: "Kyle" }                                                          
                           PrintName { name: "Rust" }                                                          
                           PrintName { name: "Tatom" }                                                         
                                                                                                               
                       }                                                                                       
                   }                                                                                           
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         6 / 8 
                                                                                                               
                                                                                                               
         Dioxus Cheatsheet(data)                                                                               
                                                                                                               
         use_signal(|| String::new),需先有一個預設值                                                             
            •  可利用 use_effect(|| { // your code here }),closure 裡面的                                            
                                                                                                               
                                                                                                               
                                #[component]                                                                   
                                pub fn PrintName(name: String) -> Element {                                    
                                    let count = use_signal(|| 0);                                              
                                    rsx! {                                                                     
                                        button {                                                               
                                            class: "text-3xl",                                                 
                                            onclick: move |_| {                                                
                                              *count.write() += 1;                                             
                                            },                                                                 
                                            "Hello my name is {name}!"                                         
                                        }                                                                      
                                        div {                                                                  
                                            class: "text-2xl",                                                 
                                            "I have been clicked {count}"                                      
                                        }                                                                      
                                    }                                                                          
                                }                                                                              
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         7 / 8 
                                                                                                               
                                                                                                               
                                                                                                               
                                     Styling Cheatsheet                                      
                                                                                                               
                                                                                                               
                                                                                                               
         ██ margin vs padding?                                                                                 
                                                                                                               
            •  皆會擴張元素「佔地面積」                                                                                    
            •  margin 不會擴張背景顏色、padding 則會                                                                      
         m-1 m-2 m-3 mt-3 mb-3 ml-3 mr-3                                                                 
         p-1 p-2 p-3 pt-3 pb-3 pl-3 pr-3                                                                 
                                                                                                               
         ██ Text 大小及顏色                                                                                         
                                                                                                               
         text-xl text-2xl text-3xl text-4xl text-5xl ...                                                 
         text-white text-red-100 text-green-300 text-slate-500                                           
                                                                                                               
         ██ Layout                                                                                             
                                                                                                               
         flex 是個智慧 Container                                                                             
            •  利用 gap-1 gap-2 控制間隔                                                                             
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                               
                                                                                                         8 / 8