---
title: '状态'
---

## 如何存储状态的一般视图

这个表格可以作为一个指南，帮助您决定哪种状态存储类型最适合您的用例：

| Hook             | 类型                       | 何时渲染?                        | 作用域                   |
| ---------------- | -------------------------- | -------------------------------- | ------------------------ |
| [use_state]      | `T`                        | 被设置一个值                     | 组件内部实例             |
| [use_state_eq]   | `T: PartialEq`             | 被设置一个不同的值               | 组件内部实例             |
| [use_reducer]    | `T: Reducible`             | 被调用归纳                       | 组件内部实例             |
| [use_reducer_eq] | `T: Reducible + PartialEq` | 被调用归纳，归纳后的值与之前不同 | 组件内部实例             |
| [use_memo]       | `Deps -> T`                | 依赖项发生变化                   | 组件内部实例             |
| [use_callback]   | `Deps -> Callback<E>`      | 依赖项发生变化                   | 组件内部实例             |
| [use_mut_ref]    | `T`                        | -                                | 组件内部实例             |
| 全局静态常量     | `T`                        | -                                | 全局，任何位置都可以使用 |

## 访问句柄内部

`UseStateHandle` 和 `UseReducerHandle` 都提供了直接访问其内部组成部分的方法。

### `value_rc()`

以 `Rc<T>` 的形式返回当前值。与对句柄解引用（返回绑定到句柄生命周期的 `&T`）不同，
`value_rc()` 返回一个拥有所有权的 `Rc<T>`，可以移动到闭包中或独立存储���

```rust
# use std::rc::Rc;
# use yew::prelude::*;
# #[component]
# fn Comp() -> Html {
let counter = use_state(|| 0);
let rc_value: Rc<i32> = counter.value_rc();
# html! {}
# }
```

### `into_inner()`

消耗句柄并返回其两个组成部分：当前值（`Rc<T>`）和 setter/dispatcher。
当你想要在不克隆整个句柄的情况下将读取与写入分离时，这非常有用。

对于 `UseReducerHandle`，返回类型为 `(Rc<T>, UseReducerDispatcher<T>)`：

```rust
# use std::rc::Rc;
# use yew::prelude::*;
# #[derive(Default, PartialEq)]
# struct CounterState { counter: i32 }
# impl Reducible for CounterState {
#     type Action = ();
#     fn reduce(self: Rc<Self>, _: ()) -> Rc<Self> { self }
# }
# #[component]
# fn Comp() -> Html {
let state = use_reducer(CounterState::default);
let (value, dispatcher) = state.into_inner();
# html! {}
# }
```

对于 `UseStateHandle`，返回类型为 `(Rc<T>, UseStateSetter<T>)`���

```rust
# use std::rc::Rc;
# use yew::prelude::*;
# #[component]
# fn Comp() -> Html {
let state = use_state(|| 0);
let (value, setter) = state.into_inner();
# html! {}
# }
```

[use_state]: https://yew-rs-api.web.app/next/yew/functional/fn.use_state.html
[use_state_eq]: https://yew-rs-api.web.app/next/yew/functional/fn.use_state_eq.html
[use_reducer]: https://yew-rs-api.web.app/next/yew/functional/fn.use_reducer.html
[use_reducer_eq]: https://yew-rs-api.web.app/next/yew/functional/fn.use_reducer_eq.html
[use_memo]: https://yew-rs-api.web.app/next/yew/functional/fn.use_memo.html
[use_callback]: https://yew-rs-api.web.app/next/yew/functional/fn.use_callback.html
[use_mut_ref]: https://yew-rs-api.web.app/next/yew/functional/fn.use_mut_ref.html
