Struct leptos::RwSignal

source ·
pub struct RwSignal<T>
where T: 'static,
{ /* private fields */ }
Expand description

A signal that combines the getter and setter into one value, rather than separating them into a ReadSignal and a WriteSignal. You may prefer this its style, or it may be easier to pass around in a context or as a function argument.

§Core Trait Implementations

  • .get() clones the current value of the signal. If you call it within an effect, it will cause that effect to subscribe to the signal, and to re-run whenever the value of the signal changes.
    • .get_untracked() clones the value of the signal without reactively tracking it.
  • .with() allows you to reactively access the signal’s value without cloning by applying a callback function.
    • .with_untracked() allows you to access the signal’s value without reactively tracking it.
  • .set() sets the signal’s value, and notifies all subscribers that the signal’s value has changed. to subscribe to the signal, and to re-run whenever the value of the signal changes.
  • .update() mutates the signal’s value in place and notifies all subscribers that the signal’s value has changed.
  • .to_stream() converts the signal to an async stream of values.
let count = create_rw_signal(0);

// ✅ set the value
count.set(1);
assert_eq!(count.get(), 1);

// ❌ you can call the getter within the setter
// count.set(count.get() + 1);

// ✅ however, it's more efficient to use .update() and mutate the value in place
count.update(|count: &mut i32| *count += 1);
assert_eq!(count.get(), 2);

Implementations§

source§

impl<T> RwSignal<T>

source

pub fn new(value: T) -> RwSignal<T>

Creates a reactive signal with the getter and setter unified in one value. You may prefer this style, or it may be easier to pass around in a context or as a function argument.

This is identical to create_rw_signal.

let count = RwSignal::new(0);

// ✅ set the value
count.set(1);
assert_eq!(count.get(), 1);

// ❌ you can call the getter within the setter
// count.set(count.get() + 1);

// ✅ however, it's more efficient to use .update() and mutate the value in place
count.update(|count: &mut i32| *count += 1);
assert_eq!(count.get(), 2);
source

pub fn read_only(&self) -> ReadSignal<T>

Returns a read-only handle to the signal.

Useful if you’re trying to give read access to another component but ensure that it can’t write to the signal and cause other parts of the DOM to update.

let count = create_rw_signal(0);
let read_count = count.read_only();
assert_eq!(count.get(), 0);
assert_eq!(read_count.get(), 0);
count.set(1);
assert_eq!(count.get(), 1);
assert_eq!(read_count.get(), 1);
source

pub fn write_only(&self) -> WriteSignal<T>

Returns a write-only handle to the signal.

Useful if you’re trying to give write access to another component, or split an RwSignal into a ReadSignal and a WriteSignal.

let count = create_rw_signal(0);
let set_count = count.write_only();
assert_eq!(count.get(), 0);
set_count.set(1);
assert_eq!(count.get(), 1);
source

pub fn split(&self) -> (ReadSignal<T>, WriteSignal<T>)

Splits an RwSignal into its getter and setter.

let count = create_rw_signal(0);
let (get_count, set_count) = count.split();
assert_eq!(count.get(), 0);
assert_eq!(get_count.get(), 0);
set_count.set(1);
assert_eq!(count.get(), 1);
assert_eq!(get_count.get(), 1);

Trait Implementations§

source§

impl<T> Clone for RwSignal<T>

source§

fn clone(&self) -> RwSignal<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T> Debug for RwSignal<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl<T> Default for RwSignal<T>
where T: Default,

source§

fn default() -> RwSignal<T>

Returns the “default value” for a type. Read more
source§

impl<'de, T> Deserialize<'de> for RwSignal<T>
where T: Deserialize<'de>,

source§

fn deserialize<D>( deserializer: D ) -> Result<RwSignal<T>, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<T> From<RwSignal<Option<T>>> for MaybeProp<T>

source§

fn from(value: RwSignal<Option<T>>) -> MaybeProp<T>

Converts to this type from the input type.
source§

impl<T> From<RwSignal<T>> for MaybeProp<T>
where T: Clone,

source§

fn from(value: RwSignal<T>) -> MaybeProp<T>

Converts to this type from the input type.
source§

impl<T> From<RwSignal<T>> for MaybeSignal<T>

source§

fn from(value: RwSignal<T>) -> MaybeSignal<T>

Converts to this type from the input type.
source§

impl<T> From<RwSignal<T>> for Signal<T>

source§

fn from(value: RwSignal<T>) -> Signal<T>

Converts to this type from the input type.
source§

impl<T> From<RwSignal<T>> for SignalSetter<T>

source§

fn from(value: RwSignal<T>) -> SignalSetter<T>

Converts to this type from the input type.
source§

impl<T> From<T> for RwSignal<T>

source§

fn from(value: T) -> RwSignal<T>

Converts to this type from the input type.
source§

impl<T> Hash for RwSignal<T>

source§

fn hash<H>(&self, state: &mut H)
where H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<T> IntoAttribute for RwSignal<T>
where T: IntoAttribute + Clone,

source§

fn into_attribute(self) -> Attribute

Converts the object into an Attribute.
source§

fn into_attribute_boxed(self: Box<RwSignal<T>>) -> Attribute

Helper function for dealing with Box<dyn IntoAttribute>.
source§

impl IntoClass for RwSignal<bool>

source§

fn into_class(self) -> Class

Converts the object into a Class.
source§

fn into_class_boxed(self: Box<RwSignal<bool>>) -> Class

Helper function for dealing with Box<dyn IntoClass>.
source§

impl<T> IntoProperty for RwSignal<T>
where T: Into<JsValue> + Clone,

source§

fn into_property(self) -> Property

Converts the object into a Property.
source§

fn into_property_boxed(self: Box<RwSignal<T>>) -> Property

Helper function for dealing with Box<dyn IntoProperty>.
source§

impl<T> IntoStyle for RwSignal<T>
where T: IntoStyle + Clone,

source§

fn into_style(self) -> Style

Converts the object into a Style.
source§

fn into_style_boxed(self: Box<RwSignal<T>>) -> Style

Helper function for dealing with Box<dyn IntoStyle>.
source§

impl<T> IntoView for RwSignal<T>
where T: IntoView + Clone,

source§

fn into_view(self) -> View

Converts the value into View.
source§

impl<T> PartialEq for RwSignal<T>

source§

fn eq(&self, other: &RwSignal<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T> Serialize for RwSignal<T>
where T: Serialize,

source§

fn serialize<S>( &self, serializer: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<T> SignalDispose for RwSignal<T>

source§

fn dispose(self)

Disposes of the signal. This: Read more
source§

impl<T> SignalGet for RwSignal<T>
where T: Clone,

§Examples

let count = create_rw_signal(0);

assert_eq!(count.get(), 0);

// count() is shorthand for count.get() on `nightly`
// assert_eq!(count(), 0);
§

type Value = T

The value held by the signal.
source§

fn get(&self) -> T
where T: Clone,

Clones and returns the current value of the signal, and subscribes the running effect to this signal. Read more
source§

fn try_get(&self) -> Option<T>

Clones and returns the signal value, returning Some if the signal is still alive, and None otherwise.
source§

impl<T> SignalGetUntracked for RwSignal<T>
where T: Clone,

§

type Value = T

The value held by the signal.
source§

fn get_untracked(&self) -> T

Gets the signal’s value without creating a dependency on the current scope. Read more
source§

fn try_get_untracked(&self) -> Option<T>

Gets the signal’s value without creating a dependency on the current scope. Returns [Some(T)] if the signal is still valid, None otherwise.
source§

impl<T> SignalSet for RwSignal<T>

§Examples

let count = create_rw_signal(0);

assert_eq!(count.get(), 0);
count.set(1);
assert_eq!(count.get(), 1);
§

type Value = T

The value held by the signal.
source§

fn set(&self, value: T)

Sets the signal’s value and notifies subscribers. Read more
source§

fn try_set(&self, new_value: T) -> Option<T>

Sets the signal’s value and notifies subscribers. Returns None if the signal is still valid, [Some(T)] otherwise. Read more
source§

impl<T> SignalSetUntracked<T> for RwSignal<T>

source§

fn set_untracked(&self, new_value: T)

Sets the signal’s value without notifying dependents.
source§

fn try_set_untracked(&self, new_value: T) -> Option<T>

Attempts to set the signal if it’s still valid. Returns None if the signal was set, [Some(T)] otherwise.
source§

impl<T> SignalStream<T> for RwSignal<T>
where T: Clone,

source§

fn to_stream(&self) -> Pin<Box<dyn Stream<Item = T>>>

Generates a Stream that emits the new value of the signal whenever it changes. Read more
source§

impl<T> SignalUpdate for RwSignal<T>

§Examples

let count = create_rw_signal(0);

// notifies subscribers
count.update(|n| *n = 1); // it's easier just to call set_count.set(1), though!
assert_eq!(count.get(), 1);

// you can include arbitrary logic in this update function
// also notifies subscribers, even though the value hasn't changed
count.update(|n| {
    if *n > 3 {
        *n += 1
    }
});
assert_eq!(count.get(), 1);
§

type Value = T

The value held by the signal.
source§

fn update(&self, f: impl FnOnce(&mut T))

Applies a function to the current value to mutate it in place and notifies subscribers that the signal has changed. Read more
source§

fn try_update<O>(&self, f: impl FnOnce(&mut T) -> O) -> Option<O>

Applies a function to the current value to mutate it in place and notifies subscribers that the signal has changed. Returns [Some(O)] if the signal is still valid, None otherwise. Read more
source§

impl<T> SignalUpdateUntracked<T> for RwSignal<T>

source§

fn update_untracked(&self, f: impl FnOnce(&mut T))

Runs the provided closure with a mutable reference to the current value without notifying dependents.
source§

fn try_update_untracked<O>(&self, f: impl FnOnce(&mut T) -> O) -> Option<O>

Runs the provided closure with a mutable reference to the current value without notifying dependents and returns the value the closure returned.
source§

impl<T> SignalWith for RwSignal<T>

§Examples

let name = create_rw_signal("Alice".to_string());

// ❌ unnecessarily clones the string
let first_char = move || name.get().chars().next().unwrap();
assert_eq!(first_char(), 'A');

// ✅ gets the first char without cloning the `String`
let first_char = move || name.with(|n| n.chars().next().unwrap());
assert_eq!(first_char(), 'A');
name.set("Bob".to_string());
assert_eq!(first_char(), 'B');
§

type Value = T

The value held by the signal.
source§

fn with<O>(&self, f: impl FnOnce(&T) -> O) -> O

Applies a function to the current value of the signal, and subscribes the running effect to this signal. Read more
source§

fn try_with<O>(&self, f: impl FnOnce(&T) -> O) -> Option<O>

Applies a function to the current value of the signal, and subscribes the running effect to this signal. Returns Some if the signal is valid and the function ran, otherwise returns None.
source§

fn track(&self)

Subscribes to this signal in the current reactive scope without doing anything with its value.
source§

impl<T> SignalWithUntracked for RwSignal<T>

§

type Value = T

The value held by the signal.
source§

fn with_untracked<O>(&self, f: impl FnOnce(&T) -> O) -> O

Runs the provided closure with a reference to the current value without creating a dependency on the current scope. Read more
source§

fn try_with_untracked<O>(&self, f: impl FnOnce(&T) -> O) -> Option<O>

Runs the provided closure with a reference to the current value without creating a dependency on the current scope. Returns [Some(O)] if the signal is still valid, None otherwise.
source§

impl<T> Copy for RwSignal<T>

source§

impl<T> Eq for RwSignal<T>

Auto Trait Implementations§

§

impl<T> Freeze for RwSignal<T>

§

impl<T> RefUnwindSafe for RwSignal<T>
where T: RefUnwindSafe,

§

impl<T> Send for RwSignal<T>
where T: Send,

§

impl<T> Sync for RwSignal<T>
where T: Sync,

§

impl<T> Unpin for RwSignal<T>
where T: Unpin,

§

impl<T> UnwindSafe for RwSignal<T>
where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<!> for T

source§

fn from(t: !) -> T

Converts to this type from the input type.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<CustErr, T, Request> FromReq<Cbor, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: DeserializeOwned,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Request> FromReq<GetUrl, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: DeserializeOwned,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Request> FromReq<Json, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: DeserializeOwned,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Request> FromReq<PostUrl, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: DeserializeOwned,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Request> FromReq<Streaming, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: From<ByteStream> + 'static,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Request> FromReq<StreamingText, Request, CustErr> for T
where Request: Req<CustErr> + Send + 'static, T: From<TextStream> + 'static,

source§

async fn from_req(req: Request) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the arguments from a request.
source§

impl<CustErr, T, Response> FromRes<Cbor, Response, CustErr> for T
where Response: ClientRes<CustErr> + Send, T: DeserializeOwned + Send,

source§

async fn from_res(res: Response) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the outputs from a response.
source§

impl<CustErr, T, Response> FromRes<Json, Response, CustErr> for T
where Response: ClientRes<CustErr> + Send, T: DeserializeOwned + Send,

source§

async fn from_res(res: Response) -> Result<T, ServerFnError<CustErr>>

Attempts to deserialize the outputs from a response.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<CustErr, T, Request> IntoReq<Cbor, Request, CustErr> for T
where Request: ClientReq<CustErr>, T: Serialize + Send,

source§

fn into_req( self, path: &str, accepts: &str ) -> Result<Request, ServerFnError<CustErr>>

Attempts to serialize the arguments into an HTTP request.
source§

impl<CustErr, T, Request> IntoReq<GetUrl, Request, CustErr> for T
where Request: ClientReq<CustErr>, T: Serialize + Send,

source§

fn into_req( self, path: &str, accepts: &str ) -> Result<Request, ServerFnError<CustErr>>

Attempts to serialize the arguments into an HTTP request.
source§

impl<CustErr, T, Request> IntoReq<Json, Request, CustErr> for T
where Request: ClientReq<CustErr>, T: Serialize + Send,

source§

fn into_req( self, path: &str, accepts: &str ) -> Result<Request, ServerFnError<CustErr>>

Attempts to serialize the arguments into an HTTP request.
source§

impl<CustErr, T, Request> IntoReq<PostUrl, Request, CustErr> for T
where Request: ClientReq<CustErr>, T: Serialize + Send,

source§

fn into_req( self, path: &str, accepts: &str ) -> Result<Request, ServerFnError<CustErr>>

Attempts to serialize the arguments into an HTTP request.
source§

impl<CustErr, T, Response> IntoRes<Cbor, Response, CustErr> for T
where Response: Res<CustErr>, T: Serialize + Send,

source§

async fn into_res(self) -> Result<Response, ServerFnError<CustErr>>

Attempts to serialize the output into an HTTP response.
source§

impl<CustErr, T, Response> IntoRes<Json, Response, CustErr> for T
where Response: Res<CustErr>, T: Serialize + Send,

source§

async fn into_res(self) -> Result<Response, ServerFnError<CustErr>>

Attempts to serialize the output into an HTTP response.
source§

impl<T> Serializable for T

source§

fn ser(&self) -> Result<String, SerializationError>

Serializes the object to a string.
source§

fn de(json: &str) -> Result<T, SerializationError>

Deserializes the object from some bytes.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

source§

impl<El> ElementDescriptorBounds for El
where El: Debug,