iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >怎么在React中进行事件驱动的状态管理
  • 987
分享到

怎么在React中进行事件驱动的状态管理

2024-04-02 19:04:59 987人浏览 薄情痞子
摘要

本篇内容主要讲解“怎么在React中进行事件驱动的状态管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在React中进行事件驱动的状态管理”吧!Store

本篇内容主要讲解“怎么在React中进行事件驱动的状态管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在React中进行事件驱动的状态管理”吧!

Store

store 是在应用程序状态下存储的数据的集合。它是通过从 Storeon 库导入的 createStoreon() 函数创建的。

createStoreon() 函数接受模块列表,其中每个模块都是一个接受 store 参数并绑定其事件监听器的函数。这是一个store 的例子:

import { createStoreon } from 'storeon/react' // todos module const todos = store => {  store.on(event, callback) }export default const store = createStoreon([todos])

模块化

Storeon 中的 store 是模块化的,也就是说,它们是独立定义的,并且没有被绑定到 Hook 或组件。每个状态及其操作方法均在被称为模块的函数中定义。这些模块被传递到 createStoreon() 函数中,然后将其注册为全局 store。

store 有三种方法:

  1. store.get() – 用于检索状态中的当前数据。

  2. store.on(event, callback) – 用于把事件侦听器注册到指定的事件名称。

  3. store.dispatch(event, data) – 用于发出事件,并根据定义的事件要求将可选数据传递进来。

Events

Storeon 是基于事件的状态管理库,状态更改由状态模块中定义的事件发出。Storeon 中有三个内置事件,它们以 @ 开头。其他事件不带 @ 前缀定义。三个内置事件是:

  1. @init – 在应用加载时触发此事件。它用于设置应用的初始状态,并执行传递给它的回调中的所有内容。

  2. @dispatch – 此事件在每个新动作上触发。这对于调试很有用。

  3. @changed – 当应用状态发生更改时,将触发此事件。

注意:store.on(event,callback) 用于在我们的模块中添加事件监听器。

演示程序

为了演示在 Storeon 中如何执行应用程序状态操作,我们将构建一个简单的 notes 程序。还会用 Storeon 的另一个软件包把状态数据保存在 localStorage 中。

假设你具有 javascript 和 React 的基本知识。你可以在https://GitHub.com/Youngestdev/storeon-app 上找到本文中使用的代码。

设置

在深入探讨之前,让我们先勾勒出 Notes 程序所需的项目结构和依赖项的安装。从创建项目文件夹开始。

mkdir storeon-app && cd storeon-app mkdir {src,public,src/Components} touch public/{index.html, style.CSS} && touch src/{index,store,Components/Notes}.js

接下来,初始化目录并安装所需的依赖项。

npm init -y npm i react react-dom react-scripts storeon @storeon/localstorage uuidv4

接下来就是在 index.js文件中编写父组件了。

`index.js`

这个文件负责渲染我们的笔记组件。首先导入所需的包。

import React from 'react'  import { render } from 'react-dom';   function App() {    return (     <>        Hello!     </>    ); } const root = document.getElementById('root'); render(<App />, root);

接下来通过在 store.js 中编写用于状态的初始化和操作的代码来构建 store。

`store.js`

此文件负责处理应用中的状态和后续状态管理操作。我们必须创建一个模块来存储状态以及支持事件,以处理操作变更。

首先,从 Storeon 导入 createStoreon 方法和唯一随机ID生成器 UUID。

createStoreon 方法负责将我们的 状态 注册到全局 store 。

import { createStoreon } from 'storeon'; import { v4 as uuidv4 } from 'uuid' import { persistState } from '@storeon/localstorage'; let note = store => {}

我们将状态存储在数组变量 notes 中,该变量包含以下格式的注释:

{   id: 'note id',   item: 'note item' },

接下来,我们将用两个注释(在首次启动程序时会显示)来初始化状态,从而首先填充注释模块。然后,定义状态事件。

let note = store => {  store.on('@init', () => ({    notes: [      { id: uuidv4(), item: 'Storeon is a React state management library and unlike other state management libraries that use Context, it utilizes an event-driven approach like Redux.' },    { id: uuidv4(), item: 'This is a really short note. I have begun to study the basic concepts of technical writing and I'\'m optimistic about becoming one of the best technical writers.' },    ]  });  store.on('addNote', ({ notes }, note) => {    return {      notes: [...notes, { id: uuidv4(), item: note }],    }  });  store.on('deleteNote', ({ notes }, id) => ({  });16}

在上面的代码中,我们定义了状态,并用两个简短的注释填充了状态,并定义了两个事件和一个从 dispatch(event, data) 函数发出事件后将会执行的回调函数。

在 addNote 事件中,我们返回添加了新 note 的更新后的状态对象,在 deleteNote 事件中把 ID 传递给调度方法的 note 过滤掉。

最后,把模块分配给可导出变量 store ,将其注册为全局 store,以便稍后将其导入到上下文 provider 中,并将状态存储在 localStorage 中。

const store = createStoreon([   notes,  // Store state in localStorage  persistState(['notes']), ]);export default store;

接下来,在 Notes.js 中编写 Notes 应用组件。

`Notes.js`

此文件包含 Notes 程序的组件。我们将从导入依赖项开始。

import React from 'react'; import { useStoreon } from 'storeon/react';

接下来,编写组件。

const Notes = () => {   const { dispatch, notes } = useStoreon('notes');  const [ value, setValue ] = React.useState('');  }

在上面的代码的第二行中,useStoreon() hook 的返回值设置为可破坏的对象。useStoreon() hook 使用模块名称作为其参数,并返回状态和调度方法以发出事件。

接下来定义在组件中发出状态定义事件的方法 。

const Notes = () => { ...   const deleteNote = id => {     dispatch('deleteNote', id)  };  const submit = () => {    dispatch('addNote', value);   setValue('');  };  const handleInput = e => {    setValue(e.target.value);  };}

让我们回顾一下上面定义的三种方法:

  1. deleteNote(id) &ndash; 此方法在触发时调度deleteNote事件。

  2. submit() &ndash; 该方法通过传递输入状态的值来调度addNote事件,该状态在Notes组件中本地定义。

  3. handleInput() &ndash; 此方法将本地状态的值设置为用户输入。

Next, we&rsquo;ll build the main interface of our app and export it.接下来,我们将构建应用程序的主界面并将其导出。

const Notes = () => {   ...  return (   <section>       <header>Quick Notes</header>       <div className='addNote'>         <textarea onChange={handleInput} value={value} />        <button onClick={() => submit()}> Add A Note </button>       </div>       <ul>         {notes.map(note => (          <li key={note.id}>             <div className='todo'>               <p>{note.item}</p>               <button onClick={() => deleteNote(note.id)}>Delete note</button>            </div>           </li>         ))}      </ul>   );24}25

这样就构成了我们的Notes组件。接下来为我们的应用和index.html文件编写样式表。

`index.html`

<!DOCTYPE html> <html lang="en"> <head>    <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <meta Http-equiv="X-UA-Compatible" content="ie=edge">    <link rel="stylesheet" href="style.css">     <title>Storeon Todo App</title> </head> <body>    <div id="root"></div> </body> </html>

接下来,填充style.css文件。

`style.css`

 * {    box-sizing: border-box;    margin: 0;    padding: 0;  }  section {    display: flex;    justify-content: center;   align-items: center;   flex-direction: column;   width: 300px;   margin: auto; }header {   text-align: center;   font-size: 24px;   line-height: 40px; }ul {   display: block; }.todo {   display: block;   margin: 12px 0;   width: 300px;   padding: 16px;   box-shadow: 0 8px 12px 0 rgba(0, 0, 0, 0.3);   transition: 0.2s;   Word-break: break-word; }li {   list-style-type: none;   display: block; }textarea {   border: 1px double;   box-shadow: 1px 1px 1px #999;   height: 100px;   margin: 12px 0;   width: 100%;   padding: 5px 10px; }button {   margin: 8px 0;   border-radius: 5px;   padding: 10px 25px; }.box:hover {   box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); }

运行

现在我们已经成功编写了组件和样式表,但是还没有更新 index.js 中的父组件来渲染 Notes 组件。接下来让我们渲染 Notes 组件。

`index.js`

要访问我们的全局 store,必须导入 store 和 Storeon store 上下文组件。我们还将导入 notes 组件来进行渲染。

用以下代码替换组件的内容:

 import { render } from 'react-dom';  import { StoreContext } from 'storeon/react';  import Notes from './Components/Notes';  import store from '../src/store';    function App() {    return (      <>       <StoreContext.Provider value={store}>         <Notes />       </StoreContext.Provider>     </>   ); }  const root = document.getElementById('root'); render(<App />, root);

在第 8-10 行,调用 store 上下文提供程序组件,并将 notes 组件作为使用者传递。store 上下文提供程序组件将全局 store 作为其上下文值。

接下来把 package.JSON 文件中的脚本部分编辑为以下内容:

"scripts": {   "start": "react-scripts start", }

然后运行我们的程序:

npm run start

让我们继续添加和删除注释:

怎么在React中进行事件驱动的状态管理

Storeon devtools

Storeon  与 Redux 有着相似的属性,可以在 Redux DevTools 中可视化和监视状态的更改。为了可视化 Storeon  程序中的状态,我们将导入 devtools 包,并将其作为参数添加到我们 store.js 文件的 createStoreon() 方法中。

... import { storeonDevtools } from 'storeon/devtools'; ...const store = createStoreon([  ...,  process.env.node_ENV !== 'production' && storeonDevtools, ]);

这是用 Redux DevTools 可视化状态变化的演示:

怎么在React中进行事件驱动的状态管理

到此,相信大家对“怎么在React中进行事件驱动的状态管理”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么在React中进行事件驱动的状态管理

本文链接: https://www.lsjlt.com/news/84630.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在React中进行事件驱动的状态管理
    本篇内容主要讲解“怎么在React中进行事件驱动的状态管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在React中进行事件驱动的状态管理”吧!Store...
    99+
    2024-04-02
  • React中使用事件驱动进行状态管理的方法
    这篇文章给大家分享的是有关React中使用事件驱动进行状态管理的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。自 Hook 被引入 React  以来,Context API 与 Hook 库在应用...
    99+
    2023-06-14
  • react18中react-redux状态管理怎么实现
    这篇文章主要介绍“react18中react-redux状态管理怎么实现”,在日常操作中,相信很多人在react18中react-redux状态管理怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”rea...
    99+
    2023-06-30
  • 如何在Linux中进行硬件设备的识别和驱动管理
    在Linux中进行硬件设备的识别和驱动管理通常是通过以下几种方式来实现: 使用命令行工具: lspci:用于显示系统的PCI设...
    99+
    2024-04-02
  • C++ 函数在并发编程中如何进行状态管理?
    在 c++++ 并发编程中管理函数状态的常见技术包括:线程局部存储 (tls) 允许每个线程维护自己的独立变量副本。原子变量允许在多线程环境中以原子方式读写共享变量。互斥锁通过防止多个线...
    99+
    2024-04-26
    并发编程 状态管理 c++
  • MySQL中怎么进行事务管理
    在MySQL中,可以通过以下方式进行事务管理: 开启事务:使用START TRANSACTION语句或BEGIN语句开启一个新的...
    99+
    2024-04-09
    MySQL
  • 在Vue 3中怎么管理共享状态
    在Vue 3中怎么管理共享状态,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。编写大型应用程序可能是一个挑战。在Vue3应用程序中使用共享状态可以解决项目复杂性。有很多常见的...
    99+
    2023-06-29
  • Beam中的状态管理怎么实现
    在Beam中,状态管理主要通过Stateful DoFn来实现。Stateful DoFn是一种特殊类型的ParDo,它可以在处理元...
    99+
    2024-04-02
  • 如何在ArchLinux中进行内核和驱动程序的更新和管理
    在ArchLinux中,可以使用以下步骤来更新和管理内核和驱动程序: 更新系统:首先,使用以下命令来更新系统的软件包列表和已安装的...
    99+
    2024-04-02
  • informix CKPT REQ的状态处理是怎么进行的
    informix CKPT REQ的状态处理是怎么进行的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 一个数据...
    99+
    2024-04-02
  • Javascript中事件驱动的原理是什么
    本篇文章为大家展示了Javascript中事件驱动的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先来看看这样一个应用场景,网页上有个链接,比如说高级搜...
    99+
    2024-04-02
  • 如何在Python中管理文件接口响应的状态?
    Python是一种功能强大的编程语言,它提供了许多文件处理的工具。当我们在Python中编写文件处理程序时,我们需要学习如何管理文件接口的响应状态。在本文中,我将介绍如何在Python中管理文件接口响应的状态。 一、文件接口响应状态的概念 ...
    99+
    2023-08-13
    文件 接口 响应
  • 怎么在SQLite中进行权限管理
    在SQLite中进行权限管理的方法主要是通过使用SQLite内置的访问控制语句和用户管理功能来实现。以下是一些常用的权限管理方法: ...
    99+
    2024-03-11
    SQLite
  • 如何在FreeBSD系统上进行硬件设备管理和驱动程序安装
    在FreeBSD系统上进行硬件设备管理和驱动程序安装通常需要以下步骤: 确定硬件设备的型号和厂商信息,以便获取相应的驱动程序。 检...
    99+
    2024-04-02
  • python中的vim 状态行插件Powerline怎么用
    这期内容当中小编将会给大家带来有关python中的vim 状态行插件Powerline怎么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言Powerline 是一个 vim 的状态行插件,为包括 zs...
    99+
    2023-06-02
  • 怎么监控和管理Apache Pig作业的运行状态
    要监控和管理Apache Pig作业的运行状态,可以使用以下方法: 使用Pig的Web界面:Apache Pig提供了一个Web...
    99+
    2024-04-02
  • 浅析Vue3动态组件怎么进行异常处理
    Vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法,希望对大家有所帮助!【相关推荐:vuejs视频教程】动态组件有两种常用场景:一是动态路由:// 动态路由 export const asyncRout...
    99+
    2023-05-14
    前端 Vue.js JavaScript
  • Shell中怎么监视指定进程的运行状态
    本篇文章给大家分享的是有关Shell中怎么监视指定进程的运行状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。现用shell脚本实现指定进程的运行状态。直接上代码。#!/bin...
    99+
    2023-06-09
  • 怎么在pygame中对键盘和鼠标事件进行处理
    本篇文章为大家展示了怎么在pygame中对键盘和鼠标事件进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。pygame 的常用事件如下所示:事件产生途径参数QUIT用户按下“关闭”按钮NoneA...
    99+
    2023-06-14
  • Laravel中怎么进行动态的config修改
    本篇内容主要讲解“Laravel中怎么进行动态的config修改”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel中怎么进行动态的config修改”吧!Laravel中的config文...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作