[2023.09.12]: Yew应用开发的第一个hook--use_state

2023-09-12 17:50:18

Yew的SSR模式推荐使用function_component组件,并且在function_component中使用hooks。其中,我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似,都是为了保存并修改当前的状态。然而,由于Yew是用Rust语言实现的,所以在具体使用上还是有一些差异的。

我的代码如下:

mod components;
mod models;
use components::TableComponent;
use models::TableRow;
use yew::prelude::*;

#[function_component]
fn Content() -> HtmlResult {
    let modalVisible = use_state(|| false);

    let onclick = {
        let modalVisible1 = modalVisible.clone();
        Callback::from(move |_| modalVisible1.set(!*modalVisible1))
    };
    let onclose = {
        let modalVisible1 = modalVisible.clone();
        Callback::from(move |_| modalVisible1.set(!*modalVisible1))
    };

    Ok(html! {
        <div class="column">
            <div class="section row content-end">
                <Button text={"新建"} {onclick} />
            </div>
            <TableComponent data={data}/>
            <Modal1 show={*modalVisible} {onclose}/>
        </div>
    })

}

#[function_component]
pub fn App() -> Html {
    let fallback = html! {<div>{"Loading..."}</div>};

    html! {
        <Suspense {fallback}>
            <Content />
        </Suspense>
    }
}

在讨论差异前,首先看use_state的声明

pub fn use_state<'hook, T, F>(
    init_fn: F
) -> impl 'hook + Hook<Output = UseStateHandle<T>>
where
    T: 'static,
    F: FnOnce() -> T,
    T: 'hook,
    F: 'hook,

UseStateHandle<T>的方法比较多,关于取值和赋值的方法如下:

fn set(&self, value: T);
fn deref(&self) -> &Self::Target;

关于差异,限于我的使用经验,我这里先提出3个地方。

1. 赋初值

给state赋初值的是FnOnce,它是Rust中的一个trait(特征),用于表示可以调用一次的闭包(Closure)。
因此,上面的代码也可以这样写:

    let init_data = || false;
    let modalVisible = use_state(init_data);

2. 状态读取

在上面的代码中,读取状态的代码如下:

<Modal1 show={*modalVisible} {onclose}/>

这个*号可以用deref()的方法来代替,这是因为UseStateHandle实现了core::ops::Deref trait。显然*使用更加方便,而且还不用显示引入core::ops::Deref;

需要注意的是,我们这里使用的是bool值,这种数据类型自动实现了Copy trait,因此,我们可以直接通过*modalVisible来使用它的值。如果是一个自定义的struct,那么这个struct要么也实现了Copy trait,要么实现了Clone trait。一般来说,我们可以直接通过#[derive(Clone)]来实现Clone trait,而实现Copy trait 则会比较麻烦。
因此,大多数情况,我们都会为struct实现Clone trait。所以,如果state是自定义的struct类型,我们要通过clone来获取它的值,例如\<TableComponent data={(*data).clone()}/>

在Reactjs中,直接通过解构useState的结果就可以拿到状态数据,相对简单得多呐。

3. 状态修改

使用set(&self, value: T) 方法来实现类似于React.js中的setXXX行为。但这里还是要提到clone()

    let onclick = {
        let modalVisible1 = modalVisible.clone();
        Callback::from(move |_| modalVisible1.set(!*modalVisible1))
    };
    let onclose = {
        let modalVisible1 = modalVisible.clone();
        Callback::from(move |_| modalVisible1.set(!*modalVisible1))
    };

我们在调用set方法之前,将modalVisible对象克隆了一份,否者会报所有权相关的错误。
另外,onclick和onclose这两段代码看似一样,但这两段代码在使用时有类型推断,因此如果复用onclick变量或者onclose变量,都会报类型错误。因此,还是要独立写成两份。这在ReactJs中是完全没有的事儿啊。

上面的内容比较粗浅。有不对的地方还希望大家多多指教。

更多推荐

算法通关村第14关【白银】| 堆的经典问题

1.数组中的第k个最大元素思路:最直观的就是选择法,遍历一k次找到第k大的数之前使用快速排序的思想每次找出一个位置,会超时这里使用堆(优先队列),找最大用小堆,找最小用大堆。例如找第k大的数,新建一个空间为k的最小优先队列,只要比当前优先队列最小值大就替换进去,这样全部的数遍历一遍,里面留下的就是前k大的数了,其他的全

科目二倒车入库

调整座位和后视镜离合踩到底大腿小腿成130-140°上半身90-100°座椅高度能看到前方全部情况后视镜调节到能看到后门把手,且后门把手刚好在后视镜上方边缘、离车1/3处。保持直线:前进:车仪表盘中央的原点和地面上的黄线擦边,这就是离右侧30-40cm倒车:右后视镜中一个手指的宽度对应地面15cm倒车观察右后视镜,车门

1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么

1.**什么是JWT?JWT的作用是什么?**JWT(JSONWebToken)是一种用于在不同系统或组件之间传输信息的紧凑且安全的标准。它的作用主要有两个方面:-**身份验证(Authentication)**:JWT通常用于验证用户的身份。当用户登录时,服务器会生成一个JWT,并将其发送给客户端。客户端随后在每个请

按钮和文本框事件监听

事件监听:当某个事情发生的时候,干什么一、按钮Button监听publicclassTestActionEvent{publicstaticvoidmain(String[]args){//按下按钮,触发一些事件Frameframe=newFrame();//弹窗的监听事件/*frame.addWindowListen

如何使用国际站腾讯云服务器进行手机测速

怎么运用腾讯云服务器进行手机测速,包括挑选适宜的服务器、装置测速软件、设置测验参数等过程。腾讯云服务器是一款高性能、高可靠性的云核算服务,能够满足用户在不同场景下的需求。而在手机测速方面,腾讯云服务器相同有着出色的表现。本文将介绍怎么运用腾讯云服务器进行手机测速,帮助用户了解自己的网络速度。首要,挑选适宜的服务器是进行

HTTPS的加密流程

对称加密:只有一个密钥。加密:明文+密钥=>密文;解码:密文+密钥=>明文。非对称加密:有两个密钥,一个公钥,一个私钥。加密:明文+公钥=>密文;解码:密文+私钥=>明文;或加密:明文+私钥=>密文;解码:密文+公钥=>明文。HTTPS的基本工作过程:加密:针对HTTP的各种header和body1.使用对称密钥,来保

正则匹配手机、邮箱、密码

正则匹配手机、邮箱、密码publicabstractclassRegexPatterns{/***手机号正则*/publicstaticfinalStringPHONE_REGEX="^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/***邮箱

Redis 全景解析

Redis解析信息图什么是Redis?Redis("REmoteDIctionaryService"的缩写)是一个开源的键值数据库服务器。对Redis最准确的描述是它是一个数据结构服务器。Redis的这种特定性质使其在开发人员中非常受欢迎和广泛采用。与其对行进行迭代、排序和排列,不如从头开始使用数据结构来存储数据?早期

spark的资源调整参数

–基础资源setspark.driver.memory=15g;setspark.driver.cores=3;setspark.driver.memoryOverhead=4096;setspark.executor.memory=5G;setspark.executor.memoryOverhead=1024;se

淘宝分布式文件存储系统(一) -TFS

淘宝分布式文件存储系统(一)->>TFS目录:什么是文件系统文件存储的一些概念文件的结构系统读取文件的方式为什么采用大文件结构的原因文件系统:将我们的数据整合成目录或者文件,提供对文件的存取接口,基于文件的权限进行访问,简单的说,文件系统就是对文件进行管理的方式.文件存储的一些概念:扇区.存储数据的磁盘的最小单位,通常

lua环境搭建数据类型

lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。1.首先我们需要下载lua开发工具包在这里我们使用的工具是luadist下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。2.接下来就是老生常谈的配置环境变量步骤如下计算机高级系

热文推荐