diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2c0d9168f..ec5a20781a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,71 @@ # Changelog +## ✹ yew **0.21.0** *(2023-09-23)* + +#### Changelog + +## 🛠 Fixes + + - Fix rust-analyzer non_camel_case_types warning. [[@Sean Bruton](https://github.com/Sean Bruton), [#3388](https://github.com/yewstack/yew/pull/3388)] + - Fix incorrect text escaping during SSR. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3381](https://github.com/yewstack/yew/pull/3381)] + - Fix top-level reconciliation in portals. [[@WorldSEnder](https://github.com/WorldSEnder), [#3020](https://github.com/yewstack/yew/pull/3020)] + - Fix clippy::let_unit_value lint in propless components. [[@WorldSEnder](https://github.com/WorldSEnder), [#2970](https://github.com/yewstack/yew/pull/2970)] + +## ⚡ Features + + - Updated the docs of `set_event_bubbling`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3391](https://github.com/yewstack/yew/pull/3391)] + - feat: support arrays for Classes/classes!(). [[@Pouriya](https://github.com/Pouriya), [#3393](https://github.com/yewstack/yew/pull/3393)] + - Mark VNode as #[must_use]. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3387](https://github.com/yewstack/yew/pull/3387)] + - Add `IntoPropValue` implementation to convert from `Cow`s to `AttrValue`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3346](https://github.com/yewstack/yew/pull/3346)] + - Remove compatibility code before 1.64. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3379](https://github.com/yewstack/yew/pull/3379)] + - Keep checked attribute for elements without special handling. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3373](https://github.com/yewstack/yew/pull/3373)] + - feat: implement hydration for vraw. [[@Dillen Meijboom](https://github.com/Dillen Meijboom), [#3245](https://github.com/yewstack/yew/pull/3245)] + - Add webkitdirectory to the boolean attributes list. [[@Julius Lungys](https://github.com/Julius Lungys), [#3214](https://github.com/yewstack/yew/pull/3214)] + - Incremental performance improvements to element creation. [[@Greg Johnston](https://github.com/Greg Johnston), [#3169](https://github.com/yewstack/yew/pull/3169)] + - Make VList's children Rc'ed. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3050](https://github.com/yewstack/yew/pull/3050)] + - Update dependencies. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3171](https://github.com/yewstack/yew/pull/3171)] + - Pass string types to Html props. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#2872](https://github.com/yewstack/yew/pull/2872)] + - Implement an internal DomSlot for positioning instead of NodeRef. [[@WorldSEnder](https://github.com/WorldSEnder), [#3048](https://github.com/yewstack/yew/pull/3048)] + - Prefer pop_first if it is available. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3084](https://github.com/yewstack/yew/pull/3084)] + - Add method map() on Children to wrap easily. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3039](https://github.com/yewstack/yew/pull/3039)] + - Reentrant event listeners. [[@WorldSEnder](https://github.com/WorldSEnder), [#3037](https://github.com/yewstack/yew/pull/3037)] + - Add impl IntoIterator on &Classes. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3038](https://github.com/yewstack/yew/pull/3038)] + - Assert there are no circular references. [[@WorldSEnder](https://github.com/WorldSEnder), [#3025](https://github.com/yewstack/yew/pull/3025)] +## 🚚 Breaking changes + + - Remove special handing of struct fields of type `Option` in `derive(Properties)`. [[@Tim Kurdov](https://github.com/Tim Kurdov), [#3398](https://github.com/yewstack/yew/pull/3398)] + - Agent v2. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2773](https://github.com/yewstack/yew/pull/2773)] + - Update signature of use_prepared_state/use_transitive_state. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3376](https://github.com/yewstack/yew/pull/3376)] + - Make signature of use_future_with consistent. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3372](https://github.com/yewstack/yew/pull/3372)] + - Allow any type to be used as Children (take 2). [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3289](https://github.com/yewstack/yew/pull/3289)] + - Enable PartialEq for all virtual dom types. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#3206](https://github.com/yewstack/yew/pull/3206)] + - Pass hook dependencies as the first function argument. [[@Arniu Tseng](https://github.com/Arniu Tseng), [#2861](https://github.com/yewstack/yew/pull/2861)] + - Make Classes cheap to clone. [[@Cecile Tonglet](https://github.com/Cecile Tonglet), [#3021](https://github.com/yewstack/yew/pull/3021)] + +## ✹ yew-router **0.18.0** *(2023-09-xx)* + +#### Changelog + +## ⚡ Features + +- Update dependencies. [[@Muhammad Hamza](https://github.com/Muhammad Hamza), [#3171](https://github.com/yewstack/yew/pull/3171)] +- Only handle "normal" clicks on s. [[@Kai Salmon](https://github.com/Kai Salmon), [#3056](https://github.com/yewstack/yew/pull/3056)] + +## 🚚 Breaking changes + +- Encode Path Parameters in `yew-router`. [[@Jedd Dryden](https://github.com/Jedd Dryden), [#3187](https://github.com/yewstack/yew/pull/3187)] +- Pass hook dependencies as the first function argument. [[@Arniu Tseng](https://github.com/Arniu Tseng), [#2861](https://github.com/yewstack/yew/pull/2861)] + +## ✹ yew-agent **0.3.0** *(2023-09-xx)* + +#### Changelog + +## 🚚 Breaking changes + +- Agent v2. [[@Kaede Hoshikawa](https://github.com/Kaede Hoshikawa), [#2773](https://github.com/yewstack/yew/pull/2773)] + +---- + ## ✹ yew **0.20.0** *(2022-11-xx)* #### Changelog diff --git a/website/blog/2023-09-23-release-0-21.md b/website/blog/2023-09-23-release-0-21.md new file mode 100644 index 00000000000..a93f40f07ee --- /dev/null +++ b/website/blog/2023-09-23-release-0-21.md @@ -0,0 +1,84 @@ +--- +title: Announcing Yew 0.21 +authors: [hamza] +--- + +The Yew development team is thrilled to unveil Yew 0.21.0, a significant milestone in the journey of empowering developers to create dependable and high-performance web applications with Rust. +Let's dive into the major highlights of this release. + +## What's new + +### 1. Changing Signatures: A Shift in Hook Dependencies + +One of the significant changes in Yew 0.21 is the adjustment to the signature of hooks that accept dependencies. +Dependencies used to be passed as the second argument after the closure. However, now they're passed as the first argument before the closure. + +```rust +use_effect_with_deps(deps, move |deps: Vec| { + // Do something with dependencies +}); +``` + +The reason behind swapping the order of dependencies in the code snippet is to address a specific use case. +In situations where the same value is needed both to compute a dependency and to be moved by value into the closure, the new order simplifies the code and improves readability and ergonomics. + +This is a big breaking change so we've provided [a way to automate the refactor](https://yew.rs/docs/migration-guides/yew/from-0_20_0-to-0_21_0#automated-refactor) + +### 2. Versatile Child Types + +Yew now allows you to use any type as children within your components. This means you're no longer limited to just the `Children` type. +Instead, you can use any type, even `Html` or closures, unlocking patterns such as: + +```rust +html! { + + {|p: RenderProps| html!{<>{"Hello, "}{p.name}}} + +} +``` + +### 3. Agents: A Complete Rewrite + +Yew 0.21 brings a complete rewrite of `yew-agent`. This streamlines and simplifies the way workers operate. Here's what you need to know: + +- **Introducing Providers:** Say goodbye to the old `Worker::bridge()` method. Now, you can use the use `WorkerProvider` / `ReactorProvider` / `OneshotProvider` as per your need, by creating them using the hooks. + +- **WorkerLink to WorkerScope:** We've removed WorkerLink in favor of WorkerScope. This change simplifies the worker architecture, making it more straightforward to manage and maintain. + +There are now 3 types of agents to be used, depending upon the situation: + +- **Worker Agent:** The original agent that uses an actor model, designed to handle complex states. + +- **Oneshot Agent:** Designed for scenarios where you expect a single input and a single output for each agent. + +- **Reactor Agent:** Ideal for situations where multiple inputs and multiple outputs are needed for each agent. + +Learn more in [documentation of yew-agent](https://docs.rs/yew-agent/latest/yew_agent/) + +### 4. Performance Improvements: A Faster and Smoother Experience + +Yew 0.21 brings substantial performance improvements. Your web applications will run faster and more efficiently, thanks to optimizations that reduce memory usage and enhance rendering. + +## Call for Contributors + +The Yew project thrives on community involvement, and we welcome contributors with open arms. Whether you're an experienced Rust developer or just starting your journey, there are plenty of ways to get involved and make a meaningful impact on Yew's growth. + +Here are some areas where you can contribute: + +- **Code Contributions:** If you're passionate about web development with Rust, consider contributing code to Yew. Whether it's fixing bugs, adding new features, or improving documentation, your code can help make Yew even better. + +- **Documentation:** Clear and comprehensive documentation is vital for any project's success. You can contribute by improving documentation, writing tutorials, or creating examples that help others understand and use Yew effectively. + +- **Testing and Bug Reporting:** Testing Yew and reporting bugs you encounter is a valuable contribution. Your feedback helps us identify and fix issues, ensuring a more stable framework for everyone. + +- **Community Support:** Join discussions, chat rooms (we have our own Discord and Matrix!), or social media to assist other developers using Yew. Sharing your knowledge and helping others solve problems is a fantastic way to contribute. + +Contributing to open-source projects like Yew is not only a way to give back to the community but also an excellent opportunity to learn, collaborate, and enhance your skills. + +To get started, check out the Yew GitHub repository and the contribution guidelines. Your contributions are highly appreciated and play a crucial role in shaping the future of Yew. Join us in this exciting journey! + +## Thanks! + +Many people came together to create Yew 0.21. We couldn't have done it without all of you. Thanks! + +See [the full changelog](https://github.com/yewstack/yew/blob/master/CHANGELOG.md) diff --git a/website/docs/migration-guides/yew/from-0_20_0-to-0_21_0.mdx b/website/docs/migration-guides/yew/from-0_20_0-to-0_21_0.mdx new file mode 100644 index 00000000000..92558ded8c3 --- /dev/null +++ b/website/docs/migration-guides/yew/from-0_20_0-to-0_21_0.mdx @@ -0,0 +1,71 @@ +--- +title: 'From 0.20.0 to 0.21.0' +--- + +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +## Dependencies as first hook argument and `use_effect_with` + +- Replace `use_effect_with_deps` with new `use_effect_with` +- `use_effect_with`, `use_callback`, `use_memo` now take dependencies as their first argument + +### Automated refactor + +With the help of [https://ast-grep.github.io](https://ast-grep.github.io/guide/quick-start.html) +Here are commands that can do the refactoring for you. + +```bash +sg --pattern 'use_effect_with_deps($CALLBACK,$$$DEPENDENCIES)' --rewrite 'use_effect_with($$$DEPENDENCIES, $CALLBACK)' -l rs -i +sg --pattern 'use_effect_with($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_effect_with($DEPENDENCIES,$$$CALLBACK)' -l rs -i + +sg --pattern 'use_callback($CALLBACK,$$$DEPENDENCIES)' --rewrite 'use_callback($$$DEPENDENCIES, $CALLBACK)' -l rs -i +sg --pattern 'use_callback($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_callback($DEPENDENCIES,$$$CALLBACK)' -l rs -i + +sg --pattern 'use_memo($CALLBACK,$$$DEPENDENCIES)' --rewrite 'use_memo($$$DEPENDENCIES, $CALLBACK)' -l rs -i +sg --pattern 'use_memo($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_memo($DEPENDENCIES,$$$CALLBACK)' -l rs -i + +sg --pattern 'use_future_with_deps($CALLBACK,$$$DEPENDENCIES)' --rewrite 'use_effect_with($$$DEPENDENCIES, $CALLBACK)' -l rs -i +sg --pattern 'use_future_with($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_effect_with($DEPENDENCIES,$$$CALLBACK)' -l rs -i + +sg --pattern 'use_transitive_state!($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_transitive_state!($DEPENDENCIES,$$$CALLBACK)' -l rs -i +sg --pattern 'use_transitive_state!($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_transitive_state!($DEPENDENCIES,$$$CALLBACK)' -l rs -i + +sg --pattern 'use_prepared_state!($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_prepared_state!($DEPENDENCIES,$$$CALLBACK)' -l rs -i +sg --pattern 'use_prepared_state!($DEPENDENCIES,,$$$CALLBACK)' --rewrite 'use_prepared_state!($DEPENDENCIES,$$$CALLBACK)' -l rs -i +``` + +### Reasoning + +This will enable more ergonomic use of hooks, consider: + + + + +```rust ,ignore +impl SomeLargeStruct { + fn id(&self) -> u32; // Only need to use the id as cache key +} +let some_dep: SomeLargeStruct = todo!(); + +{ + let id = some_dep.id(); // Have to extract it in advance, some_dep is moved already in the second argument + use_effect_with_dep(move |_| { todo!(); drop(some_dep); }, id); +} +``` + + + + +```rust ,ignore +impl SomeLargeStruct { + fn id(&self) -> u32; // Only need to use the id as cache key +} +let some_dep: SomeLargeStruct = todo!(); + +use_effect_with(some_dep.id(), move |_| { todo!(); drop(some_dep); }); + +``` + + + diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 0f64678e51b..79c40d11b12 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -119,8 +119,8 @@ module.exports = { prism: { additionalLanguages: ['rust', 'toml'], }, - googleAnalytics: { - trackingID: 'UA-141789564-1', + gtag: { + trackingID: 'G-DENCL8P4YP', anonymizeIP: true, }, }, diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21.json b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21.json new file mode 100644 index 00000000000..0ab4c0608c2 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21.json @@ -0,0 +1,86 @@ +{ + "version.label": { + "message": "0.21", + "description": "The label for version 0.21" + }, + "sidebar.docs.category.Getting Started": { + "message": "Getting Started", + "description": "The label for category Getting Started in sidebar docs" + }, + "sidebar.docs.category.Concepts": { + "message": "Concepts", + "description": "The label for category Concepts in sidebar docs" + }, + "sidebar.docs.category.Concepts.link.generated-index.title": { + "message": "Yew concepts", + "description": "The generated-index page title for category Concepts in sidebar docs" + }, + "sidebar.docs.category.Concepts.link.generated-index.description": { + "message": "Learn about the important Yew concepts!", + "description": "The generated-index page description for category Concepts in sidebar docs" + }, + "sidebar.docs.category.Using Basic Web Technologies In Yew": { + "message": "Using Basic Web Technologies In Yew", + "description": "The label for category Using Basic Web Technologies In Yew in sidebar docs" + }, + "sidebar.docs.category.Using Basic Web Technologies In Yew.link.generated-index.title": { + "message": "Yew's Take on Basic Web Technologies", + "description": "The generated-index page title for category Using Basic Web Technologies In Yew in sidebar docs" + }, + "sidebar.docs.category.Using Basic Web Technologies In Yew.link.generated-index.description": { + "message": "Yew centrally operates on the idea of keeping everything that a reusable piece of UI may needin one place - rust files, while also keeping the underlying technology accessible where necessary. Explore further to fully grasp what we mean by these statements:", + "description": "The generated-index page description for category Using Basic Web Technologies In Yew in sidebar docs" + }, + "sidebar.docs.category.Components": { + "message": "Components", + "description": "The label for category Components in sidebar docs" + }, + "sidebar.docs.category.Hooks": { + "message": "Hooks", + "description": "The label for category Hooks in sidebar docs" + }, + "sidebar.docs.category.HTML": { + "message": "HTML", + "description": "The label for category HTML in sidebar docs" + }, + "sidebar.docs.category.Advanced topics": { + "message": "Advanced topics", + "description": "The label for category Advanced topics in sidebar docs" + }, + "sidebar.docs.category.Advanced topics.link.generated-index.title": { + "message": "Advanced topics", + "description": "The generated-index page title for category Advanced topics in sidebar docs" + }, + "sidebar.docs.category.Advanced topics.link.generated-index.description": { + "message": "Learn about the advanced topics and inner workings of Yew!", + "description": "The generated-index page description for category Advanced topics in sidebar docs" + }, + "sidebar.docs.category.Struct Components": { + "message": "Struct Components", + "description": "The label for category Struct Components in sidebar docs" + }, + "sidebar.docs.category.More": { + "message": "More", + "description": "The label for category More in sidebar docs" + }, + "sidebar.docs.category.More.link.generated-index.title": { + "message": "Miscellaneous", + "description": "The generated-index page title for category More in sidebar docs" + }, + "sidebar.docs.category.Migration guides": { + "message": "Migration guides", + "description": "The label for category Migration guides in sidebar docs" + }, + "sidebar.docs.category.yew": { + "message": "yew", + "description": "The label for category yew in sidebar docs" + }, + "sidebar.docs.category.yew-agent": { + "message": "yew-agent", + "description": "The label for category yew-agent in sidebar docs" + }, + "sidebar.docs.category.yew-router": { + "message": "yew-router", + "description": "The label for category yew-router in sidebar docs" + } +} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/how-it-works.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/how-it-works.mdx new file mode 100644 index 00000000000..c0a15e94326 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/how-it-works.mdx @@ -0,0 +1,8 @@ +--- +title: How it works +description: Low level details about the framework +--- + +# 䜎レベルなラむブラリの䞭身 + +コンポヌネントのラむフサむクルの状態機械、VDOM の異なるアルゎリズム diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/optimizations.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/optimizations.mdx new file mode 100644 index 00000000000..d9db08c0fa9 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/optimizations.mdx @@ -0,0 +1,171 @@ +--- +title: Optimizations +description: Make your app faster +--- + +# 最適化ずベストプラクティス + +## neq_assign + +芪コンポヌネントから props を受け取った際、`change`メ゜ッドが呌ばれたす。 +これはコンポヌネントの状態を曎新するこずができるのに加え、コンポヌネントが props が倉わった際に再レンダリングするかどうかを決める +`ShouldRender`ずいう真停倀を返すこずができたす。 + +再レンダリングはコストがかかるもので、もし避けられるのであれば避けるべきです。 +䞀般的なルヌルずしお props が実際に倉化した際にのみ再レンダリングすれば良いでしょう。 +以䞋のコヌドブロックはこのルヌルを衚しおおり、props が前ず倉わったずきに`true`を返したす。 + +```rust +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 + } + } +} +``` + +しかし我々は先に進んでいけたす +この 6 行のボむラヌプレヌドは`PartialEq`を実装したものにトレむトずブランケットを甚いるこずで 1 行のコヌドぞず萜ずし蟌むこずができたす。 +[こちら](https://docs.rs/yewtil/*/yewtil/trait.NeqAssign.html)にお`yewtil`クレヌトの`NewAssign`トレむトを芋おみおください。 + +## 効果的にスマヌトポむンタを䜿う + +**泚意: このセクションで䜿われおいる甚語がわからなければ Rust book は +[スマヌトポむンタに぀いおの章](https://doc.rust-lang.org/book/ch15-00-smart-pointers.html) +があり、非垞に有甚です。** + +再レンダリングの際に props を䜜るデヌタを倧量にコピヌしないために、スマヌトポむンタを甚いおデヌタ自䜓ではなくデヌタぞの参照だけを +コピヌできたす。 +props や子コンポヌネントで関連するデヌタに実デヌタではなく参照を枡すず、子コンポヌネントでデヌタを倉曎する必芁がなければ +デヌタのコピヌを避けるこずができたす。 +その際、`Rc::make_mut`によっお倉曎したいデヌタの倉曎可胜な参照を埗るこずができたす。 + +これにより、props が倉曎されたずきにコンポヌネントが再レンダリングされるかどうかを決めるかで`Component::change`に曎なる恩恵がありたす。 +なぜなら、デヌタの倀を比范する代わりに元々のポむンタのアドレス (぀たりデヌタが保管されおいる機械のメモリの堎所) を比范できるためです。 +2 ぀のポむンタヌが同じデヌタを指す堎合、それらのデヌタの倀は同じでなければならないのです。 +ただし、その逆は必ずしも成り立たないこずに泚意しおください! +もし 2 ぀のポむンタが異なるのであれば、そのデヌタは同じである可胜性がありたす。 +この堎合はデヌタを比范するべきでしょう。 + +この比范においおは`PartialEq`ではなく`Rc::ptr_eq`を䜿う必芁がありたす。 +`PartialEq`は等䟡挔算子`==`を䜿う際に自動的に䜿われたす。 +Rust のドキュメントには[`Rc::ptr_eq`に぀いおより詳しく曞いおありたす](https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.ptr_eq)。 + +この最適化は`Copy`を実装しおいないデヌタの型に察しお極めお有効なものです。 +もしデヌタを簡単に倉曎できるのであれば、スマヌトポむンタに取り換える必芁はありたせん。 +しかし`Vec`や`HashMap`、`String`などのような重たいデヌタの構造䜓に察しおはスマヌトポむンタを䜿うこずで +パフォヌマンスを改善するこずができるでしょう。 + +この最適化は倀がただ䞀床も子によっお曎新されおいない堎合に極めお有効で、芪からほずんど曎新されない堎合においおもかなり有効です。 +これにより、`Rc<_>s`が玔粋なコンポヌネントに察しおプロパティの倀をラップする良い䞀手ずなりたす。 + +## View 関数 + +コヌドの可読性の理由から`html!`の郚分を関数ぞず移怍するのは意味がありたす。 +これは、むンデントを枛らすのでコヌドを読みやすくするだけでなく、良いデザむンパタヌンを産むこずにも繋がるのです。 +これらの関数は耇数箇所で呌ばれお曞くべきコヌド量を枛らせるため、分解可胜なアプリケヌションを䜜るこずができるのです。 + +## 玔粋なコンポヌネント + +玔粋なコンポヌネントは状態を倉化せず、ただ䞭身を衚瀺しおメッセヌゞを普通の倉曎可胜なコンポヌネントぞ枡すコンポヌネントのこずです。 +View 関数ずの違いずしお、玔粋なコンポヌネントは匏の構文\(`{some_view_function()}`\)ではなく +コンポヌネントの構文\(``\)を䜿うこずで`html!`マクロの䞭で呌ばれる点、 +そしお実装次第で蚘憶され (぀たり、䞀床関数が呌ばれれば倀は"保存"され、 +同じ匕数でもう䞀床呌ばれおも倀を再蚈算する必芁がなく最初に関数が呌ばれたずきの保存された倀を返すこずができる)、 +先述の`neq_assign`ロゞックを䜿う別々の props で再レンダリングを避けられる点がありたす。 + +Yew は玔粋な関数やコンポヌネントをサポヌトしおいたせんが、倖郚のクレヌトを甚いるこずで実珟できたす。 + +## 関数型コンポヌネント (a.k.a フック) + +関数型コンポヌネントはただ開発䞭です +開発状況に぀いおは[プロゞェクトボヌド](https://github.com/yewstack/yew/projects/3)に詳しく曞いおありたす。 + +## キヌ付き DOM ノヌド + +## ワヌクスペヌスでコンパむル時間を枛らす + +間違いなく Yew を䜿う䞊での最倧の欠点はコンパむルに時間がかかる点です。 +プロゞェクトのコンパむルにかかる時間は`html!`マクロに枡されるコヌドの量に関係しおいたす。 +これは小さなプロゞェクトにはそこたで問題ないようですが、倧きなアプリではコヌドを耇数クレヌトに分割するこずでアプリに倉曎が加られた際に +コンパむラの䜜業量を枛らすのが有効です。 + +䞀぀可胜なやり方ずしお、ルヌティングずペヌゞ掗濯を担圓するメむンのクレヌトを䜜り、それぞれのペヌゞに察しお別のクレヌトを䜜るこずです。 +そうしお各ペヌゞは異なるコンポヌネントか、`Html`を生成する倧きな関数ずなりたす。 +アプリの異なる郚分を含むクレヌト同士で共有されるコヌドはプロゞェクト党䜓で䟝存する分離したクレヌトに保存されたす。 +理想的には 1 回のコンパむルでコヌド党おを再ビルドせずメむンのクレヌトかどれかのペヌゞのクレヌトを再ビルドするだけにするこずです。 +最悪なのは、"共通"のクレヌトを線集しお、はじめに戻っおくるこずです: +共有のクレヌトに䟝存しおいる党おのコヌド、恐らく党おのコヌドをコンパむルするこずです。 + +もしメむンのクレヌトが重たすぎる、もしくは深くネストしたペヌゞ (䟋えば別ペヌゞのトップでレンダリングされるペヌゞ) +で速く繰り返したい堎合、クレヌトの䟋を甚いおメむンペヌゞの実装をシンプルにしたりトップで動かしおいるコンポヌネントをレンダリングできたす。 + +## バむナリサむズを小さくする + +- Rust のコヌドを最適化する +- `cargo.toml` \( release profile を定矩 \) +- `wasm-opt`を甚いお wasm のコヌドを最適化する + +**泚意: バむナリサむズを小さくするのに぀いおは[Rust Wasm Book](https://rustwasm.github.io/book/reference/code-size.html#optimizing-builds-for-code-size)に詳しく曞いおありたす。** + +### Cargo.toml + +`Cargo.toml`で`[profile.release]`のセクションに蚭定を曞き蟌むこずでリリヌスビルドを小さくするこずが可胜です。 + +```text +[profile.release] +# バむナリに含むコヌドを少なくする +panic = 'abort' +# コヌドベヌス党䜓での最適化 ( 良い最適化だがビルドが遅くなる) +codegen-units = 1 +# サむズの最適化( よりアグレッシブに ) +opt-level = 'z' +# サむズの最適化 +# opt-level = 's' +# プログラム党䜓の分析によるリンク時最適化 +lto = true +``` + +### wasm-opt + +曎に`wasm`のコヌドのサむズを最適化するこずができたす。 + +The Rust Wasm Book には Wasm バむナリのサむズを小さくするこずに぀いおのセクションがありたす: +[Shrinking .wasm size](https://rustwasm.github.io/book/game-of-life/code-size.html) + +- `wasm-pack`でデフォルトの`wasm`のコヌドをリリヌスビルド時に最適化する +- `wasm-opt`によっお盎接`wasm`ファむルを最適化する + +```text +wasm-opt wasm_bg.wasm -Os -o wasm_bg_opt.wasm +``` + +#### yew/examples/にある䟋を小さなサむズでビルドする + +泚意: `wasm-pack`は Rust ず Wasm のコヌドぞの最適化を組み合わせたす。`wasm-bindgen`はこの䟋では Rust のサむズ最適化を甚いおいたせん。 + +| 䜿甚したツヌル | サむズ | +| :-------------------------- | :----- | +| wasm-bindgen | 158KB | +| wasm-bindgen + wasm-opt -Os | 116KB | +| wasm-pack | 99 KB | + +## 参考文献: + +- [The Rust Book のスマヌトポむンタに関する章](https://doc.rust-lang.org/book/ch15-00-smart-pointers.html) +- [the Rust Wasm Book でのバむナリサむズを小さくするこずに぀いお](https://rustwasm.github.io/book/reference/code-size.html#optimizing-builds-for-code-size) +- [Rust profiles に぀いおのドキュメント](https://doc.rust-lang.org/cargo/reference/profiles.html) +- [binaryen プロゞェクト](https://github.com/WebAssembly/binaryen) diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/callbacks.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/callbacks.mdx new file mode 100644 index 00000000000..7799426a3c6 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/callbacks.mdx @@ -0,0 +1,35 @@ +--- +title: Callbacks +description: ComponentLink and Callbacks +--- + +”リンク”コンポヌネントはコンポヌネントがコヌルバックを登録できお自身を曎新するこずができるメカニズムです。 + +## ComponentLink API + +### callback + +実行時にコンポヌネントの曎新メカニズムにメッセヌゞを送信するコヌルバックを登録したす。 +これは、枡されたクロヌゞャから返されるメッセヌゞで `send_self` を呌び出したす。 +`Fn(IN) -> Vec`が枡され、`Callback`が返されたす。 + +### send_message + +珟圚のルヌプが終了した盎埌にコンポヌネントにメッセヌゞを送信し、別の曎新ルヌプを開始したす。 + +### send_message_batch + +実行時に䞀床に倚数のメッセヌゞを䞀括しお送信するコヌルバックを登録したす。 +メッセヌゞによっおコンポヌネントが再レンダリングされる堎合、バッチ内のすべおのメッセヌゞが凊理された埌、コンポヌネントは再レンダリングされたす。 +`Fn(IN) -> COMP::Message`が枡され、`Callback`が返されたす。 + +## コヌルバック + +_\(This might need its own short page.\)_ + +コヌルバックは、Yew 内のサヌビス、゚ヌゞェント、芪コンポヌネントずの通信に䜿われたす。 +これらは単に `Fn` を `Rc` でラップしただけであり、クロヌンを䜜成できるようにするためのものです。 + +これらの関数には `emit` 関数があり、`` 型を匕数に取り、それをアドレスが欲しいメッセヌゞに倉換したす。 +芪からのコヌルバックが子コンポヌネントに props で提䟛されおいる堎合、子は `update` ラむフサむクルフックで `emit` をコヌルバックに呌び出しお芪にメッセヌゞを返すこずができたす。 +マクロ内で props ずしお提䟛されたクロヌゞャや関数は自動的にコヌルバックに倉換されたす。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/lifecycle.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/lifecycle.mdx new file mode 100644 index 00000000000..274c3d815d9 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/lifecycle.mdx @@ -0,0 +1,198 @@ +--- +title: Introduction +description: Components and their lifecycle hooks +--- + +## コンポヌネントずは? + +コンポヌネントは Yew を構成するブロックです。 +コンポヌネントは状態を管理し、自身を DOM ぞレンダリングするこずができたす。 +コンポヌネントはラむフサむクルの機胜がある`Component`トレむトを実装するこずによっお䜜られたす。 + +## ラむフサむクル + +:::important contribute +`Contribute to our docs:` [Add a diagram of the component lifecycle](https://github.com/yewstack/docs/issues/22) +::: + +## ラむフサむクルのメ゜ッド + +### Create + +コンポヌネントが䜜られるず、`ComponentLink`ず同様に芪コンポヌネントからプロパティを受け取りたす。 +プロパティはコンポヌネントの状態を初期化するのに䜿われ、"link"はコヌルバックを登録したりコンポヌネントにメッセヌゞを送るのに䜿われたす。 + +props ず link をコンポヌネント構造䜓に栌玍するのが䞀般的です。 +䟋えば: + +```rust +pub struct MyComponent { + props: Props, + link: ComponentLink, +} + +impl Component for MyComponent { + type Properties = Props; + // ... + + fn create(props: Self::Properties, link: ComponentLink) -> Self { + MyComponent { props, link } + } + + // ... +} +``` + +### View + +コンポヌネントは`view()`メ゜ッドによっおレむアりトを宣蚀したす。 +Yew は`html!`マクロによっお HTML ず SVG ノヌド、リスナヌ、子コンポヌネントを宣蚀できたす。 +マクロは React の JSX のような動きをしたすが、JavaScript の代わりに Rust の匏を甚いたす。 + +```rust +impl Component for MyComponent { + // ... + + fn view(&self) -> Html { + let onclick = self.link.callback(|_| Msg::Click); + html! { + + } + } +} +``` + +䜿い方に぀いおは[`html!`ガむド](concepts/html/introduction.mdx)をご確認ください。 + +### Rendered + +`rendered()`コンポヌネントのラむフサむクルのメ゜ッドは`view()`が凊理されたお Yew がコンポヌネントをレンダリングした埌、 +ブラりザがペヌゞを曎新する前に呌ばれたす。 +コンポヌネントは、コンポヌネントが芁玠をレンダリングした埌にのみ実行できるアクションを実行するため、このメ゜ッドを実装したい堎合がありたす。 +コンポヌネントが初めおレンダリングされたかどうかは `first_render` パラメヌタで確認できたす。 + +```rust +use stdweb::web::html_element::InputElement; +use stdweb::web::IHtmlElement; +use yew::prelude::*; + +pub struct MyComponent { + node_ref: NodeRef, +} + +impl Component for MyComponent { + // ... + + fn view(&self) -> Html { + html! { + + } + } + + fn rendered(&mut self, first_render: bool) { + if first_render { + if let Some(input) = self.node_ref.try_into::() { + input.focus(); + } + } + } +} +``` + +:::tip note +ラむフサむクルメ゜ッドは実装の必芁がなく、デフォルトでは䜕もしたせん。 +::: + +### Update + +コンポヌネントは動的で、非同期メッセヌゞを受信するために登録するこずができたす。 +ラむフサむクルメ゜ッド `update()` はメッセヌゞごずに呌び出されたす。 +これにより、コンポヌネントはメッセヌゞが䜕であったかに基づいお自身を曎新し、自身を再レンダリングする必芁があるかどうかを刀断するこずができたす。 +メッセヌゞは、HTML 芁玠リスナヌによっおトリガヌされたり、子コンポヌネント、゚ヌゞェント、サヌビス、たたは Futures によっお送信されたりしたす。 + +`update()`がどのようなのかに぀いおの䟋は以䞋の通りです: + +```rust +pub enum Msg { + SetInputEnabled(bool) +} + +impl Component for MyComponent { + type Message = Msg; + + // ... + + fn update(&mut self, msg: Self::Message) -> ShouldRender { + match msg { + Msg::SetInputEnabled(enabled) => { + if self.input_enabled != enabled { + self.input_enabled = enabled; + true // Re-render + } else { + false + } + } + } + } +} +``` + +### Change + +コンポヌネントは芪によっお再レンダリングされるこずがありたす。 +このような堎合、新しいプロパティを受け取り、再レンダリングを遞択する可胜性がありたす。 +この蚭蚈では、プロパティを倉曎するこずで、芪から子ぞのコンポヌネントの通信が容易になりたす。 + +兞型的な実装䟋は以䞋の通りです: + +```rust +impl Component for MyComponent { + // ... + + fn change(&mut self, props: Self::Properties) -> ShouldRender { + if self.props != props { + self.props = props; + true + } else { + false + } + } +} +``` + +### Destroy + +コンポヌネントが DOM からアンマりントされた埌、Yew は `destroy()` ラむフサむクルメ゜ッドを呌び出し、必芁なクリヌンアップ操䜜をサポヌトしたす。 +このメ゜ッドはオプションで、デフォルトでは䜕もしたせん。 + +## Associated Types + +`Component`トレむトは 2 ぀の関連型がありたす: `Message`ず`Properties`です。 + +```rust +impl Component for MyComponent { + type Message = Msg; + type Properties = Props; + + // ... +} +``` + +`Message`はコンポヌネントによっお凊理され、䜕らかの副䜜甚を匕き起こすこずができるさたざたなメッセヌゞを衚したす。 +䟋えば、API リク゚ストをトリガヌしたり、UI コンポヌネントの倖芳を切り替えたりする `Click` メッセヌゞがありたす。 +コンポヌネントのモゞュヌルで `Msg` ずいう名前の列挙型を䜜成し、それをコンポヌネントのメッセヌゞ型ずしお䜿甚するのが䞀般的です。 +"message"を"msg"ず省略するのも䞀般的です。 + +```rust +enum Msg { + Click, +} +``` + +`Properties`は、芪からコンポヌネントに枡される情報を衚したす。 +この型は Properties trait を実装しおいなければならず\(通垞はこれを掟生させるこずで\)、特定のプロパティが必須かオプションかを指定するこずができたす。 +この型は、コンポヌネントの䜜成・曎新時に䜿甚されたす。 +コンポヌネントのモゞュヌル内に `Props` ずいう構造䜓を䜜成し、それをコンポヌネントの `Properties` 型ずしお䜿甚するのが䞀般的です。 +”Properties”を"props"に短瞮するのが䞀般的です。 +Props は芪コンポヌネントから継承されるので、アプリケヌションのルヌトコンポヌネントは通垞`()`型の`Properties`を持ちたす。 +ルヌトコンポヌネントのプロパティを指定したい堎合は、`App::mount_with_props`メ゜ッドを利甚したす。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/properties.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/properties.mdx new file mode 100644 index 00000000000..560f9c1e6e7 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/properties.mdx @@ -0,0 +1,84 @@ +--- +title: Properties +description: Parent to child communication +--- + +プロパティは、子コンポヌネントず芪コンポヌネントが互いに通信できるようにしたす。 + +## マクロの継承 + +`Properties`を自分で実装しようずせず、代わりに`#[derive(Properties)]`を䜿っおください。 + +:::note +`Properties`を継承した型は`Clone`を実装しおいなければいけたせん。 +これは`#[derive(Properties, Clone)`か`Clone`を手で実装するこずで可胜です。 +::: + +### 必芁な属性 + +デフォルトでは、`Properties` を導出する構造䜓内のフィヌルドは必須です。 +フィヌルドが欠萜しおいお `html!` マクロでコンポヌネントが䜜成された堎合、コンパむラ゚ラヌが返されたす。 +オプションのプロパティを持぀フィヌルドに぀いおは、`#[prop_or_default]` 属性を䜿甚しお、prop が指定されおいない堎合はその型のデフォルト倀を䜿甚したす。 +倀を指定するには `#[prop_or(value)]` 属性を甚いたす。 +ここで value はプロパティのデフォルト倀、あるいは代わりに `#[prop_or_else(function)]` を䜿甚しお、`function` はデフォルト倀を返したす。 +䟋えば、ブヌル倀のデフォルトを `true` ずするには、属性 `#[prop_or(true)]` を䜿甚したす。オプションのプロパティでは、デフォルト倀 `None` を持぀ `Option` 列挙型を䜿うのが䞀般的です。 + +### PartialEq + +もし可胜なら props で `PartialEq` を継承するのが良いかもしれたせん。 +`PartialEq`を䜿うこずで、䞍必芁な再レンダリングを避けるこずができたす +(これに぀いおは、**最適化ずベストプラクティス**のセクションで説明しおいたす)。 + +## プロパティを䜿甚する際のメモリず速床のオヌバヌヘッド + +`Compoenent::view`ではコンポヌネントの状態ぞの参照を取り、それを䜿っお `Html` を䜜成したす。 +しかし、プロパティは自身の倀です。 +぀たり、それらを䜜成しお子コンポヌネントに枡すためには、`view` 関数で提䟛される参照を所有する必芁があるのです。 +これは所有する倀を取埗するためにコンポヌネントに枡される参照を暗黙のうちにクロヌンするこずで行われたす。 + +これは、各コンポヌネントが芪から受け継いだ状態の独自のコピヌを持っおいるこずを意味し、コンポヌネントを再レンダリングするずきはい぀でも、再レンダリングしたコンポヌネントのすべおの子コンポヌネントの props がクロヌンされなければならないこずを意味したす。 + +このこずの意味するずころは、もしそうでなければ*倧量の*デヌタ \(10KB もあるような文字列\) を props ずしお枡しおしたうのであれば、子コンポヌネントを芪が呌び出す `Html` を返す関数にするこずを考えた方がいいかもしれないずいうこずです。 + +props を介しお枡されたデヌタを倉曎する必芁がない堎合は、実際のデヌタそのものではなく、デヌタぞの参照カりントされたポむンタのみが耇補されるように `Rc` でラップするこずができたす。 + +## 䟋 + +```rust +use std::rc::Rc; +use yew::Properties; + +#[derive(Clone, PartialEq)] +pub enum LinkColor { + Blue, + Red, + Green, + Black, + Purple, +} + +impl Default for LinkColor { + fn default() -> Self { + // The link color will be blue unless otherwise specified. + LinkColor::Blue + } +} + +#[derive(Properties, Clone, PartialEq)] +pub struct LinkProps { + /// The link must have a target. + href: String, + /// If the link text is huge, this will make copying the string much cheaper. + /// This isn't usually recommended unless performance is known to be a problem. + text: Rc, + /// Color of the link. + #[prop_or_default] + color: LinkColor, + /// The view function will not specify a size if this is None. + #[prop_or_default] + size: Option, + /// When the view function doesn't specify active, it defaults to true. + #[prop_or(true)] + active: bool, +} +``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/refs.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/refs.mdx new file mode 100644 index 00000000000..bfaf178cc4b --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/advanced-topics/struct-components/refs.mdx @@ -0,0 +1,24 @@ +--- +title: Refs +description: Out-of-band DOM access +--- + +`ref`は、任意の HTML 芁玠やコンポヌネントの内郚で、割り圓おられおいる DOM`Element`を取埗するために䜿甚するこずができたす。 +これは、`view` ラむフサむクルメ゜ッドの倖で DOM に倉曎を加えるために䜿甚できたす。 + +これは、キャンバスの芁玠を取埗したり、ペヌゞの異なるセクションにスクロヌルしたりするのに䟿利です。 + +構文は以䞋の通りです: + +```rust +// In create +self.node_ref = NodeRef::default(); + +// In view +html! { +
+} + +// In update +let has_attributes = self.node_ref.try_into::().has_attributes(); +``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/agents.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/agents.mdx new file mode 100644 index 00000000000..efe31f8efef --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/agents.mdx @@ -0,0 +1,56 @@ +--- +title: Agents +description: Yew's Actor System +--- + +゚ヌゞェントは Angular の[サヌビス](https://angular.io/guide/architecture-services)に䌌おおり\(ただし䟝存性むンゞェクションはありたせん\)、 +[アクタヌモデル](https://en.wikipedia.org/wiki/Actor_model)を提䟛したす。 +゚ヌゞェントはコンポヌネント階局のどこに䜍眮するかに関わらず、コンポヌネント間でメッセヌゞをルヌティングしたり、共有状態を䜜成したり、UI をレンダリングするメむンスレッドから蚈算量の倚いタスクをオフロヌドするために䜿甚するこずができたす。 +たた、Yew アプリケヌションがタブをたたいで通信できるようにするための゚ヌゞェントのサポヌトも\(将来的には\)蚈画されおいたす。 + +゚ヌゞェントが䞊行に動くように Yew は[web-workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)を䜿甚しおいたす。 + +## ラむフサむクル + +![゚ヌゞェントのラむフサむクル](https://user-images.githubusercontent.com/42674621/79125224-b6481d80-7d95-11ea-8e6a-ab9b52d1d8ac.png) + +## ゚ヌゞェントの皮類 + +### Reaches + +- Context - Context ゚ヌゞェントのむンスタンスは、垞に最倧 1 ぀存圚したす。 + Bridges は、UI スレッド䞊で既にスポヌンされた゚ヌゞェントをスポヌンするか、接続したす。 + これは、コンポヌネントたたは他の゚ヌゞェント間の状態を調敎するために䜿甚するこずができたす。 + この゚ヌゞェントに Bridges が接続されおいない堎合、この゚ヌゞェントは消滅したす。 + +- Job - 新しいブリッゞごずに UI スレッド䞊で新しい゚ヌゞェントをスポヌンしたす。 + これは、ブラりザず通信する共有されおいるが独立した動䜜をコンポヌネントの倖に移動させるのに適しおいたす。 + (TODO 確認) タスクが完了するず、゚ヌゞェントは消えたす。 + +- Public - Context ず同じですが、独自の web worker で動䜜したす。 + +- Private - Job ず同じですが、独自の web worker で動䜜したす。 + +- Global \(WIP\) + +## ゚ヌゞェントずコンポヌネントのやり取り + +### Bridges + +Bridge は、゚ヌゞェントずコンポヌネント間の双方向通信を可胜にしたす。 +たた、Bridge ぱヌゞェント同士の通信を可胜にしたす。 + +### Dispatchers + +Dispatcher は、コンポヌネントず゚ヌゞェント間の䞀方向通信を可胜にしたす。 +Dispatcher は、コンポヌネントが゚ヌゞェントにメッセヌゞを送信するこずを可胜にしたす。 + +## オヌバヌヘッド + +独自の独立した web worker(プラむベヌトずパブリック)にある゚ヌゞェントは、送受信するメッセヌゞにシリアラむズするオヌバヌヘッドが発生したす。 +他のスレッドずの通信には[bincode](https://github.com/servo/bincode)を䜿甚するので、関数を呌び出すよりもコストはかなり高くなりたす。 +蚈算コストがメッセヌゞの受け枡しコストを䞊回る堎合を陀き、ロゞックを UI スレッド゚ヌゞェント\(Job たたは Context\)に栌玍する必芁がありたす。 + +## 参考資料 + +- [web_worker_fib](https://github.com/yewstack/yew/tree/master/examples/web_worker_fib)の䟋でコンポヌネントがどのように゚ヌゞェントず通信させおいるかがわかりたす。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/components.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/components.mdx new file mode 100644 index 00000000000..23434dad96c --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/components.mdx @@ -0,0 +1,108 @@ +--- +title: Components +description: Create complex layouts with component hierarchies +--- + +## 基本 + +`Component`を実装しおいるあらゆる型は`html!`マクロの䞭で䜿えたす: + +```rust +html!{ + <> + // No properties + + + // With Properties + + + // With the whole set of props provided at once + + + // With Properties from a variable and specific values overridden + + +} +``` + +## ネスト + +`children`フィヌルドが`Properties`の䞭にある堎合はコンポヌネントは子に枡されたす。 + +```rust title="parent.rs" +html! { + +

{ "Hi" }

+
{ "Hello" }
+
+} +``` + +```rust title="container.rs" +pub struct Container(Props); + +#[derive(Properties, Clone)] +pub struct Props { + pub children: Children, +} + +impl Component for Container { + type Properties = Props; + + // ... + + fn view(&self) -> Html { + html! { +
+ { self.0.children.clone() } +
+ } + } +} +``` + +:::note +`Properties`を継承した型は`Clone`を実装しおいなければいけたせん。 +これは`#[derive(Properties, Clone)]`を䜿うか手で`Clone`を実装すれば良いです。 +::: + +## Props ずネストした子コンポヌネント + +ネストしたコンポヌネントのプロパティは栌玍しおいるコンポヌネントの型が子である堎合はアクセス可胜、たたは倉曎可胜です。 +以䞋の䟋では`List`コンポヌネントは`ListItem`コンポヌネントをラップできおいたす。 +実際の䜿甚においおこのパタヌンの䟋に぀いおは`yew-router`の゜ヌスコヌドを確認しおみおください。 +より進んだ䟋ずしおは Yew のメむンのリポゞトリにある`nested-list`を確認しおみおください。 + +```rust title="parent.rs" +html! { + + + + + +} +``` + +```rust title="list.rs" +pub struct List(Props); + +#[derive(Properties, Clone)] +pub struct Props { + pub children: ChildrenWithProps, +} + +impl Component for List { + type Properties = Props; + + // ... + + fn view(&self) -> Html { + html!{{ + for self.0.children.iter().map(|mut item| { + item.props.value = format!("item-{}", item.props.value); + item + }) + }} + } +} +``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/elements.mdx b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/elements.mdx new file mode 100644 index 00000000000..9bb97e147c2 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/version-0.21/concepts/html/elements.mdx @@ -0,0 +1,373 @@ +--- +title: Elements +description: Both HTML and SVG elements are supported +--- + +## タグ構造 + +芁玠のタグは`<... />`のような自己完結タグか、開始タグに察応した終了タグを持っおいる必芁がありたす。 + + + + +```rust +html! { +
+} +``` + + + +```rust +html! { +
// <- MISSING CLOSE TAG +} +``` + + + +```rust +html! { + +} +``` + + + +```rust +html! { + // <- MISSING SELF-CLOSE +} +``` + + + +:::note +䟿利さのために、*普通は*終了タグを必芁ずする芁玠は自己完結タグずするこずが**できたす**。 +䟋えば`html! {
}`ず曞くのは有効です。 +::: + +## 子 + +耇雑にネストした HTML や SVG のレむアりトを曞くのには以䞋のようにするのが楜です: +\*\* + + + + +```rust +html! { +
+
+
+ + + + +