前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React 中使用 Vue3.6 Vapor 同款 Signal 是一种什么体验?

React 中使用 Vue3.6 Vapor 同款 Signal 是一种什么体验?

作者头像
萌萌哒草头将军
发布于 2025-03-06 15:44:38
发布于 2025-03-06 15:44:38
21400
代码可运行
举报
文章被收录于专栏:前端框架前端框架
运行总次数:0
代码可运行

React Signals 是一个轻量级的状态管理库,它提供了一种简单而强大的方式来管理 React 应用中的状态。它的 API 设计受到了 SolidJS 的启发,使用起来非常直观。

该架构和被合入vue3.6 vapor分支的alien-signals 是一样的!

地址:https://github.com/hunghg255/reactjs-signal/tree

基础用法

1. 创建信号 (createSignal)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createSignal } from "reactjs-signal";

// 创建一个初始值为 0 的信号
export const count = createSignal(0);

2. 在组件中使用信号

有三种主要方式可以在组件中使用信号:

2.1 使用 useSignal(获取值和设置器)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useSignal } from "reactjs-signal";
import { count } from "../signals/counter";

export const Counter = () => {
  const [value, setValue] = useSignal(count);

  return (
    <div>
      <p>Count: {value}</p>
      <button onClick={() => setValue((v) => v + 1)}>Increment</button>
    </div>
  );
};
2.2 使用 useSignalValue(仅获取值)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useSignalValue } from "reactjs-signal";
import { count } from "../signals/counter";

export const Display = () => {
  const value = useSignalValue(count);

  return <div>Current count: {value}</div>;
};
2.3 使用 useSetSignal(仅获取设置器)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useSetSignal } from "reactjs-signal";
import { count } from "../signals/counter";

export const Controls = () => {
  const setCount = useSetSignal(count);

  return (
    <div>
      <button onClick={() => setCount((v) => v + 1)}>+1</button>
      <button onClick={() => setCount((v) => v - 1)}>-1</button>
    </div>
  );
};

3. 计算信号 (createComputed)

计算信号允许你基于其他信号创建派生状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createSignal, createComputed } from "reactjs-signal";

const count = createSignal(0);
const doubleCount = createComputed(() => count() * 2);
const isEven = createComputed(() => count() % 2 === 0);

4. 信号效果 (useSignalEffect)

使用 useSignalEffect 可以在信号值变化时执行副作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useSignalEffect } from "reactjs-signal";
import { count } from "../signals/counter";

export const Logger = () => {
  useSignalEffect(() => {
    console.log("Count changed:", count());
  });

  return null;
};

5. 服务端渲染支持 (useHydrateSignal)

如果你需要在服务端渲染时初始化信号值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useHydrateSignal } from "reactjs-signal";
import { count } from "../signals/counter";

export const App = () => {
  // 在组件挂载时将 count 信号的值设置为 10
  useHydrateSignal(count, 10);

  return <div>...</div>;
};

一点点心得

  • 使用 useSignalValue 当只需要读取值时
  • 使用 useSetSignal 当只需要更新值时
  • 适当使用 createComputed 来缓存计算结果

实践:todo 应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createSignal, createComputed } from"reactjs-signal";

exportinterface Todo {
  id: number;
  text: string;
  completed: boolean;
}

exportconst todos = createSignal<Todo[]>([]);
exportconst filter = createSignal<"all" | "active" | "completed">("all");

exportconst filteredTodos = createComputed(() => {
const currentFilter = filter();
const currentTodos = todos();

switch (currentFilter) {
    case"active":
      return currentTodos.filter((todo) => !todo.completed);
    case"completed":
      return currentTodos.filter((todo) => todo.completed);
    default:
      return currentTodos;
  }
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useSignal, useSignalValue } from"reactjs-signal";
import { todos, filter, filteredTodos } from"../signals/todos";

exportconst TodoApp = () => {
const [, setTodos] = useSignal(todos);
const [currentFilter, setFilter] = useSignal(filter);
const visibleTodos = useSignalValue(filteredTodos);

const addTodo = (text: string) => {
    setTodos((prev) => [
      ...prev,
      {
        id: Date.now(),
        text,
        completed: false,
      },
    ]);
  };

return (
    <div>
      <input
        type="text"
        onKeyPress={(e) => {
          if (e.key === "Enter") {
            addTodo(e.currentTarget.value);
            e.currentTarget.value = "";
          }
        }}
      />
      <ul>
        {visibleTodos.map((todo) => (
          <li key={todo.id}>{todo.text}</li>
        ))}
      </ul>
      <div>
        <button onClick={() => setFilter("all")}>All</button>
        <button onClick={() => setFilter("active")}>Active</button>
        <button onClick={() => setFilter("completed")}>Completed</button>
      </div>
    </div>
  );
};

记住,信号的主要优势在于其简单性和响应式特性,这使得状态管理变得更加直观和高效。

最后

今天的分享就到这里了,如果文章中有问题,欢迎指正!

如果对你有帮助,记得关注我

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萌萌哒草头将军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何重塑思维,轻松学会React
首先,React主要提供两大功能:组件(Components)和状态管理(State Management)。组件是React应用的基本构建块,状态则是用来管理组件数据的方式。通过组合这些组件和管理状态,你可以创建复杂且功能强大的前端应用。
前端达人
2024/06/14
1760
如何重塑思维,轻松学会React
介绍 Preact Signals
Signals 是用来处理状态的一种方式,它参考自 SolidJS,吸收了其大部分的优点。无论应用多么复杂,它都能保证快速响应。
尹光耀
2022/09/17
9620
介绍 Preact Signals
博文精选|MobX — 10分钟极速入门 MobX 与 React
http://eyehere.net/2016/mobx-getting-started/(点击阅读原文前往)
java达人
2018/12/18
5300
推荐十一个React Hook库
在React开发中,保持干净的代码风格,可读性,可维护性,更少的代码行以及可重用性至关重要。本篇文章将向您介绍应立即开始使用的十一个React Hook库。不用再拖延了,让我们开始吧。
用户3806669
2021/07/06
4.4K0
推荐十一个React Hook库
听说 Signals 快要登陆 React 了?
“Signals”专门用于管理客户端状态,而且从最近的趋势来看,其很有可能在 React 中发挥作用。
深度学习与Python
2024/04/26
2090
听说 Signals 快要登陆 React 了?
【SolidJs】仅次于原生JS的超级性能!SolidJs框架教程【上】
今天被战友种草了一款前端框架,打开链接看文章,在各个指标的比较下,SolidJs脱颖而出,下面简单介绍一下这个框架,然后开始记录一下学习笔记。(Golang的事情暂时放一放,毕竟咱是专业前端「手动狗头」)。
HoMeTown
2022/10/26
4.9K0
【SolidJs】仅次于原生JS的超级性能!SolidJs框架教程【上】
MobX 和 React 十分钟快速入门
这个教程将在十分钟内向你详解 MobX 的所有重要概念。MobX 是一个独立的库,但是大部分人将它和 React 共同使用,所以本教程将重点讲解他们的结合使用。
疯狂的技术宅
2019/03/27
1.5K0
MobX 和 React 十分钟快速入门
[译]全栈 Todolist-client 篇(React Typescript)
写在最前面 如果没看前面的 node server篇 和 mongoDB database篇 ,可以先看看,这篇是结合上面两篇一起学习的文章 您可以按照顺序阅读 全栈 Todolist-server 篇 Node(server) React(client) MongoDB(database) Typescript Todolist-database 篇(Cloud MongoDB) Todolist-client 篇(React Typescript) 1、创建一个 react app(源码代码参考) 接着
西南_张家辉
2021/02/02
5950
Redux 包教包会(一):解救 React 状态危机
前端应用的状态管理日益复杂。随着大前端时代的到来,前端愈来愈注重处理逻辑,而不只是专注 UI 层面的改进,而以 React 为代表的前端框架的出现,大大简化了我们编写 UI 界面的复杂度。虽然 React 提供了 State 机制实现状态管理,也有诸如“状态提升”等开发约定,但是这些方案只适用于小型应用,当你的前端应用有多达 10 个以上页面时,如何让应用状态可控、让协作开发高效成为了亟待解决的问题,而 Redux 的出现正是为了解决这些问题而生的!Redux 提出的“数据的唯一真相来源”、单向数据流、“纯函数 Reducers” 大大简化了前端逻辑,使得我们能够以高效、便于协作的方式编写任意复杂的前端应用。本篇教程致力于用简短的文字讲透 Redux,在实战中掌握 Redux 的概念和精髓。
一只图雀
2020/04/07
1.9K0
【愚公系列】《AIGC辅助软件开发》043-AI辅助提升程序员求职、招聘与面试效率:用ChatGPT 出面试题
在当今快速发展的科技行业,程序员的求职和招聘面临着越来越高的要求和压力。求职者不仅需要具备扎实的技术能力,还需在面试中展现出色的表达和应对能力。而对于招聘方来说,如何高效地筛选出合适的人才同样是一项挑战。随着人工智能(AI)技术的崛起,特别是像ChatGPT这样的智能工具,求职和招聘的效率得到了显著提升。
愚公搬代码
2025/01/06
1580
【案例】使用React+redux实现一个Todomvc
❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…
且陶陶
2024/07/25
2020
【案例】使用React+redux实现一个Todomvc
react hook 那些事儿
首先,它是在react16.8版本中引入的概念,也就说如果你的react版本低于16.8,你是不能使用的,因此在使用它的时候,一定要注意react的版本。
程序那些事儿
2023/03/07
5400
react hook 那些事儿
写给vue转react的同志们(4)
应各位老爷要求,这篇文章开始拥抱hooks,本文将从vue3与react 17.x(hooks)对比来感受两大框架的同工异曲之处。
饼干_
2022/09/19
8680
Vue+Webpack打造todo应用 原
B.vue-loader需要安装15版本以下(参考官方文档 https://vue-loader.vuejs.org/migrating.html#a-plugin-is-now-required . Vue-loader在15.*之后的版本都是 vue-loader的使用都是需要伴生 VueLoaderPlugin的)
晓歌
2018/08/15
1.3K0
Vue+Webpack打造todo应用
                                                                            原
使用 Vue 3 与 TypeScript 构建 Web 应用: Todo
引言 界面: Vue.js 3 JavaScript 超集: TypeScript 包管理器: pnpm 前端工程化/打包: Vite 路由: Vue Router 状态管理: Pinia CSS 预处理器: Less 代码格式化: Prettier 代码质量: ESLint 预览
yiyun
2023/07/17
1.2K0
使用 Vue 3 与 TypeScript 构建 Web 应用: Todo
Redux入门实战——todo-list2.0实现
在之前的博客中,我写了一篇关于todo-list实现的博客,一步一步详细的记录了如何使用基础的React知识实现一个React单页面应用,通过该篇文章,能够对React入门开发有一个直观的认识和粗浅的理解。
CherishTheYouth
2020/08/12
1.4K0
Redux入门实战——todo-list2.0实现
MobX状态管理:简洁而强大的状态机
MobX 是一个用于构建可响应的数据模型的库,它提供了一种声明式的方式来管理状态,使得数据的变化能够自动更新相关的视图。
天涯学馆
2024/08/16
3520
vue2.0教程
或者使用CDN <script src="https://unpkg.com/vue/dist/vue.js"></script>
lilugirl
2019/05/28
8690
vue2.0教程
Redux 包教包会(二):趁热打铁,重拾初心
在这一部分中,我们将趁热打铁,运用上篇教程学到的 Redux 三大核心概念来将待办事项的剩下部分重构完成,它涉及到将 TodoList 和 Footer 部分的相关代码重构到 Redux,并使用 Redux combineReducers API 进行逻辑拆分和组合,使得我们可以在使用 Redux 便利的同时,又不至于让应用的逻辑看起来臃肿不堪,复用 React 组件化的便利,我们可以让状态的处理也 “组件化”。最后,我们将让 React 回归初心——专注于展现用户界面,通过“容器组件”和“展示组件”将逻辑和状态进一步分离。
一只图雀
2020/04/07
2.4K0
Vue中的$emit组件事件运用
话不多说上代码 vue>src>App.vue <template> <div id="app"> <!-- header --> <Header/> <AddTodo v-on:handleAdd="handleAdd"/> <Todos :todos="todos" @handleDelete="handleDelete"/> </div> </template> <script> import Todos from "./comp
landv
2019/07/01
1.4K0
Vue中的$emit组件事件运用
相关推荐
如何重塑思维,轻松学会React
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验