優化與最佳實例
neq_assign
當元件從父元件接收到屬性時, change
的方法就會被呼叫。除了讓你更新元件的狀態,也讓你回傳,決定元件是否要在屬性改變時,重新渲染自己的布林值 ShouldRender
。
重新渲染是很浪費效能的,儘可能避免這麼做。一般來說,只有在屬性真的改變時,才重新渲染。下面的程式碼是體現這個原則的例子,當屬性改變時,才回傳 true
:
use yew::ShouldRender;
#[derive(PartialEq)]
struct ExampleProps;
struct Example {
props: ExampleProps,
};
impl Example {
fn change(&mut self, props: ExampleProps) -> ShouldRender {
if self.props != props {
self.props = props;
true
} else {
false
}
}
}
但我們可以走的更遠!這六行的模板,使用一個 trait 和一個 實作了 PartialEq
的 blanket implementation ,可以被縮短至一行。請參考這裡, yewtil
的 crate 裡的 NeqAssign
trait。
RC
為了避免重新渲染時,複製大量的資料來建立屬性,我們可以使用智慧指針來讓程式只複製指針。如果你使用 Rc<_>
來封裝你的屬性,而不是未封裝的值,你可以使用 Rc::make_mut
,去複製與存取你想要改變的資料的可變參考,這做到了延遲複製,直到你需要更動子元件的資料。透過避免複製直到有值改變,子元件可以在 Component::change
拒絕與他狀態中的屬性相同值的屬性,而且這樣不會有任何效能成本。另外,這個方式,資料必須在與子元件比較與被拒絕之前,被複製進父元件的屬性中。
這個優化最那些無法 Copy
的資料型別最有用。如果你可以輕易複製你的資料,那把資料放進智慧指針裡面似乎就沒有這麼值得。對於那些包含很多像是 Vec
、 HashMap
與 String
的結構,這個優化對他們會更值得。
如果子元件幾乎不會更新值,那這個優化效果會很好,甚至如果父元件也很少更新,那效果會更好。上面的情況,使在純元件中使用 Rc<_>s
是一個封裝屬性值很好的選擇。