mirror of
https://github.com/yewstack/yew.git
synced 2025-12-08 21:26:25 +00:00
Improve Context API docs (#3409)
* improved context API docs, added example of struct component context producer * forgot to commit that oops
This commit is contained in:
parent
954b0ec7b9
commit
a2786b1e14
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -493,7 +493,6 @@ dependencies = [
|
|||||||
name = "contexts"
|
name = "contexts"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
|
||||||
"yew",
|
"yew",
|
||||||
"yew-agent",
|
"yew-agent",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -5,6 +5,5 @@ edition = "2021"
|
|||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
|
||||||
yew = { path = "../../packages/yew", features = ["csr"] }
|
yew = { path = "../../packages/yew", features = ["csr"] }
|
||||||
yew-agent = { path = "../../packages/yew-agent" }
|
yew-agent = { path = "../../packages/yew-agent" }
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
mod msg_ctx;
|
mod msg_ctx;
|
||||||
mod producer;
|
mod producer;
|
||||||
|
mod struct_component_producer;
|
||||||
mod struct_component_subscriber;
|
mod struct_component_subscriber;
|
||||||
mod subscriber;
|
mod subscriber;
|
||||||
|
|
||||||
use msg_ctx::MessageProvider;
|
use msg_ctx::MessageProvider;
|
||||||
use producer::Producer;
|
use producer::Producer;
|
||||||
|
use struct_component_producer::StructComponentProducer;
|
||||||
use struct_component_subscriber::StructComponentSubscriber;
|
use struct_component_subscriber::StructComponentSubscriber;
|
||||||
use subscriber::Subscriber;
|
use subscriber::Subscriber;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
@ -14,6 +16,7 @@ pub fn App() -> Html {
|
|||||||
html! {
|
html! {
|
||||||
<MessageProvider>
|
<MessageProvider>
|
||||||
<Producer />
|
<Producer />
|
||||||
|
<StructComponentProducer />
|
||||||
<Subscriber />
|
<Subscriber />
|
||||||
<StructComponentSubscriber />
|
<StructComponentSubscriber />
|
||||||
</MessageProvider>
|
</MessageProvider>
|
||||||
|
|||||||
@ -6,10 +6,8 @@ use super::msg_ctx::MessageContext;
|
|||||||
pub fn Producer() -> Html {
|
pub fn Producer() -> Html {
|
||||||
let msg_ctx = use_context::<MessageContext>().unwrap();
|
let msg_ctx = use_context::<MessageContext>().unwrap();
|
||||||
|
|
||||||
let onclick = Callback::from(move |_| msg_ctx.dispatch("Message Received.".to_string()));
|
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<button {onclick}>
|
<button onclick={move |_| msg_ctx.dispatch("Message Received.".to_string())}>
|
||||||
{"PRESS ME"}
|
{"PRESS ME"}
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|||||||
27
examples/contexts/src/struct_component_producer.rs
Normal file
27
examples/contexts/src/struct_component_producer.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
|
||||||
|
use super::msg_ctx::MessageContext;
|
||||||
|
|
||||||
|
pub struct StructComponentProducer;
|
||||||
|
|
||||||
|
impl Component for StructComponentProducer {
|
||||||
|
type Message = ();
|
||||||
|
type Properties = ();
|
||||||
|
|
||||||
|
fn create(_ctx: &Context<Self>) -> Self {
|
||||||
|
Self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(&self, ctx: &Context<Self>) -> Html {
|
||||||
|
let (msg_ctx, _) = ctx
|
||||||
|
.link()
|
||||||
|
.context::<MessageContext>(Callback::noop())
|
||||||
|
.expect("No Message Context Provided");
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<button onclick={move |_| msg_ctx.dispatch("Other message received.".to_owned())}>
|
||||||
|
{"OR ME"}
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,7 +11,7 @@ use crate::functional::{Hook, HookContext};
|
|||||||
/// is returned. A component which calls `use_context` will re-render when the data of the context
|
/// is returned. A component which calls `use_context` will re-render when the data of the context
|
||||||
/// changes.
|
/// changes.
|
||||||
///
|
///
|
||||||
/// More information about contexts and how to define and consume them can be found on [Yew Docs](https://yew.rs).
|
/// More information about contexts and how to define and consume them can be found on [Yew Docs](https://yew.rs/docs/concepts/contexts).
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
|
|||||||
@ -96,35 +96,57 @@ A context provider is required to consume the context. `ContextProvider<T>`, whe
|
|||||||
The children are re-rendered when the context changes. A struct is used to define what data is to be passed. The `ContextProvider` can be used as:
|
The children are re-rendered when the context changes. A struct is used to define what data is to be passed. The `ContextProvider` can be used as:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
use std::rc::Rc;
|
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
|
/// App theme
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
struct Theme {
|
struct Theme {
|
||||||
foreground: String,
|
foreground: String,
|
||||||
background: String,
|
background: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Main component
|
||||||
#[function_component]
|
#[function_component]
|
||||||
fn NavButton() -> Html {
|
pub fn App() -> Html {
|
||||||
let theme = use_context::<Theme>();
|
let ctx = use_state(|| Theme {
|
||||||
|
foreground: "#000000".to_owned(),
|
||||||
html! {
|
background: "#eeeeee".to_owned(),
|
||||||
// use theme
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[function_component]
|
|
||||||
fn App() -> Html {
|
|
||||||
let theme = use_memo((), |_| Theme {
|
|
||||||
foreground: "yellow".to_owned(),
|
|
||||||
background: "pink".to_owned(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<ContextProvider<Rc<Theme>> context={theme}>
|
// `ctx` is type `Rc<UseStateHandle<Theme>>` while we need `Theme`
|
||||||
<NavButton />
|
// so we deref it.
|
||||||
</ContextProvider<Rc<Theme>>>
|
// It derefs to `&Theme`, hence the clone
|
||||||
|
<ContextProvider<Theme> context={(*ctx).clone()}>
|
||||||
|
// Every child here and their children will have access to this context.
|
||||||
|
<Toolbar />
|
||||||
|
</ContextProvider<Theme>>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The toolbar.
|
||||||
|
/// This component has access to the context
|
||||||
|
#[function_component]
|
||||||
|
pub fn Toolbar() -> Html {
|
||||||
|
html! {
|
||||||
|
<div>
|
||||||
|
<ThemedButton />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Button placed in `Toolbar`.
|
||||||
|
/// As this component is a child of `ThemeContextProvider` in the component tree, it also has access
|
||||||
|
/// to the context.
|
||||||
|
#[function_component]
|
||||||
|
pub fn ThemedButton() -> Html {
|
||||||
|
let theme = use_context::<Theme>().expect("no ctx found");
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<button style={format!("background: {}; color: {};", theme.background, theme.foreground)}>
|
||||||
|
{ "Click me!" }
|
||||||
|
</button>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user