1
- use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2
-
3
- use leptos:: * ;
1
+ use leptos:: prelude:: * ;
4
2
use rand:: prelude:: * ;
5
- use wasm_bindgen:: { prelude:: * , JsCast } ;
6
-
3
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
7
4
static ADJECTIVES : & [ & str ] = & [
8
5
"pretty" ,
9
6
"large" ,
@@ -33,19 +30,19 @@ static ADJECTIVES: &[&str] = &[
33
30
] ;
34
31
35
32
static COLOURS : & [ & str ] = & [
36
- "red" , "yellow" , "blue" , "green" , "pink" , "brown" , "purple" , "brown" ,
37
- "white" , "black" , " orange",
33
+ "red" , "yellow" , "blue" , "green" , "pink" , "brown" , "purple" , "brown" , "white" , "black" ,
34
+ "orange" ,
38
35
] ;
39
36
40
37
static NOUNS : & [ & str ] = & [
41
- "table" , "chair" , "house" , "bbq" , "desk" , "car" , "pony" , "cookie" ,
42
- "sandwich" , "burger" , " pizza", "mouse" , "keyboard" ,
38
+ "table" , "chair" , "house" , "bbq" , "desk" , "car" , "pony" , "cookie" , "sandwich" , "burger" ,
39
+ "pizza" , "mouse" , "keyboard" ,
43
40
] ;
44
41
45
- #[ derive( Copy , Debug , Clone , PartialEq , Eq , Hash ) ]
42
+ #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
46
43
struct RowData {
47
44
id : usize ,
48
- label : ( ReadSignal < String > , WriteSignal < String > ) ,
45
+ label : ArcRwSignal < String > ,
49
46
}
50
47
51
48
static ID_COUNTER : AtomicUsize = AtomicUsize :: new ( 1 ) ;
@@ -70,11 +67,10 @@ fn build_data(count: usize) -> Vec<RowData> {
70
67
71
68
data. push ( RowData {
72
69
id : ID_COUNTER . load ( Ordering :: Relaxed ) ,
73
- label : create_signal ( label) ,
70
+ label : ArcRwSignal :: new ( label) ,
74
71
} ) ;
75
72
76
- ID_COUNTER
77
- . store ( ID_COUNTER . load ( Ordering :: Relaxed ) + 1 , Ordering :: Relaxed ) ;
73
+ ID_COUNTER . store ( ID_COUNTER . load ( Ordering :: Relaxed ) + 1 , Ordering :: Relaxed ) ;
78
74
}
79
75
80
76
data
@@ -89,36 +85,31 @@ fn Button(
89
85
text : & ' static str ,
90
86
) -> impl IntoView {
91
87
view ! {
92
-
93
88
<div class="col-sm-6 smallpad" >
94
- <button
95
- id=id
96
- class="btn btn-primary btn-block"
97
- type ="button"
98
- >
89
+ <button id=id class="btn btn-primary btn-block" type ="button" >
99
90
{ text}
100
91
</button>
101
92
</div>
102
93
}
103
94
}
104
95
105
96
#[ component]
106
- fn App ( ) -> impl IntoView {
107
- let ( data, set_data) = create_signal ( Vec :: < RowData > :: new ( ) ) ;
108
- let ( selected, set_selected) = create_signal ( None :: < usize > ) ;
97
+ pub fn App ( ) -> impl IntoView {
98
+ let ( data, set_data) = signal ( Vec :: < RowData > :: new ( ) ) ;
99
+ let ( selected, set_selected) = signal ( None :: < usize > ) ;
109
100
110
101
let remove = move |id : usize | {
111
102
set_data. update ( move |data| data. retain ( |row| row. id != id) ) ;
112
103
} ;
113
104
114
105
let run = move |_| {
115
- set_data ( build_data ( 1000 ) ) ;
116
- set_selected ( None ) ;
106
+ set_data. set ( build_data ( 1000 ) ) ;
107
+ set_selected. set ( None ) ;
117
108
} ;
118
109
119
110
let run_lots = move |_| {
120
- set_data ( build_data ( 10000 ) ) ;
121
- set_selected ( None ) ;
111
+ set_data. set ( build_data ( 10000 ) ) ;
112
+ set_selected. set ( None ) ;
122
113
} ;
123
114
124
115
let add = move |_| {
@@ -128,14 +119,14 @@ fn App() -> impl IntoView {
128
119
let update = move |_| {
129
120
data. with ( |data| {
130
121
for row in data. iter ( ) . step_by ( 10 ) {
131
- row. label . 1 . update ( |n| n. push_str ( " !!!" ) ) ;
122
+ row. label . update ( |n| n. push_str ( " !!!" ) ) ;
132
123
}
133
124
} ) ;
134
125
} ;
135
126
136
127
let clear = move |_| {
137
- set_data ( Vec :: new ( ) ) ;
138
- set_selected ( None ) ;
128
+ set_data. set ( Vec :: new ( ) ) ;
129
+ set_selected. set ( None ) ;
139
130
} ;
140
131
141
132
let swap_rows = move |_| {
@@ -146,63 +137,61 @@ fn App() -> impl IntoView {
146
137
} ) ;
147
138
} ;
148
139
149
- let is_selected = create_selector ( selected) ;
140
+ let is_selected = Selector :: new ( move || selected. get ( ) ) ;
150
141
151
142
view ! {
152
-
153
143
<div class="container" >
154
144
<div class="jumbotron" >
155
145
<div class="row" >
156
- <div class="col-md-6" ><h1>"Leptos" </h1></div>
146
+ <div class="col-md-6" >
147
+ <h1>"Leptos" </h1>
148
+ </div>
157
149
<div class="col-md-6" >
158
150
<div class="row" >
159
- <Button id="run" text="Create 1,000 rows" on: click=run />
160
- <Button id="runlots" text="Create 10,000 rows" on: click=run_lots />
161
- <Button id="add" text="Append 1,000 rows" on: click=add />
162
- <Button id="update" text="Update every 10th row" on: click=update />
163
- <Button id="clear" text="Clear" on: click=clear />
164
- <Button id="swaprows" text="Swap Rows" on: click=swap_rows />
151
+ <Button id="run" text="Create 1,000 rows" on: click=run/>
152
+ <Button id="runlots" text="Create 10,000 rows" on: click=run_lots/>
153
+ <Button id="add" text="Append 1,000 rows" on: click=add/>
154
+ <Button id="update" text="Update every 10th row" on: click=update/>
155
+ <Button id="clear" text="Clear" on: click=clear/>
156
+ <Button id="swaprows" text="Swap Rows" on: click=swap_rows/>
165
157
</div>
166
158
</div>
167
159
</div>
168
160
</div>
169
161
<table class="table table-hover table-striped test-data" >
170
162
<tbody>
171
163
<For
172
- each={ data}
173
- key={ |row| row. id}
164
+ each=move || data. get ( )
165
+ key=|row| row. id
174
166
children=move |row: RowData | {
175
167
let row_id = row. id;
176
- let ( label, _) = row. label;
177
- on_cleanup( {
178
- let is_selected = is_selected. clone( ) ;
179
- move || {
180
- label. dispose( ) ;
181
- is_selected. remove( & Some ( row_id) ) ;
182
- }
183
- } ) ;
168
+ let label = row. label;
184
169
let is_selected = is_selected. clone( ) ;
185
170
template! {
186
171
<tr class: danger={ move || is_selected. selected( Some ( row_id) ) } >
187
172
<td class="col-md-1" >{ row_id. to_string( ) } </td>
188
- <td class="col-md-4" ><a on: click=move |_| set_selected( Some ( row_id) ) >{ move || label. get ( ) } </a></td>
173
+ <td class="col-md-4" ><a on: click=move |_| set_selected( Some ( row_id) ) >{ label} </a></td>
189
174
<td class="col-md-1" ><a on: click=move |_| remove( row_id) ><span class="glyphicon glyphicon-remove" aria-hidden="true" ></span></a></td>
190
175
<td class="col-md-6" />
191
176
</tr>
192
177
}
193
178
}
194
179
/>
180
+
195
181
</tbody>
196
182
</table>
197
- <span class="preloadicon glyphicon glyphicon-remove" aria-hidden="true" />
183
+ <span class="preloadicon glyphicon glyphicon-remove" aria-hidden="true" />
198
184
</div>
199
185
}
200
186
}
201
187
202
- #[ wasm_bindgen( start) ]
188
+ #[ wasm_bindgen:: prelude :: wasm_bindgen ( start) ]
203
189
pub fn start ( ) {
190
+ use wasm_bindgen:: JsCast ;
191
+
204
192
console_error_panic_hook:: set_once ( ) ;
205
193
206
194
let root = document ( ) . query_selector ( "#main" ) . unwrap ( ) . unwrap ( ) ;
207
- mount_to ( root. unchecked_into ( ) , || view ! { <App /> } ) ;
195
+ let handle = mount_to ( root. unchecked_into ( ) , App ) ;
196
+ handle. forget ( ) ;
208
197
}
0 commit comments