React Typescript 故事书通过 onChange 回调实现自定义输入组件,然后将 State 值返回到输入

2024-03-13

我目前正在用故事书实现一个 React 定制输入组件。 我希望实现的是这个定制的输入组件将需要几个参数,其中一个参数是onChangeInput,稍后它将负责为“输入值”设置状态值,下面是我的主要输入组件实现:

输入.tsx

import React from 'react'

export type Props = {
  /**
   * This is the Label text value
   */
  labelText?: string,
  /**
   * Placeholder text for input
   */
  placeholder?: string,
  /**
   * Classes defined here will be appended to the input's default classes
   */
  className?: string,
  /**
   * Value attribute of Input
   */
  value?: string,
  /**
   * Name attribute of Input
   */
  name?: string,
  /**
   * Label for attribute
   */
  htmlFor?: string,
  /**
   * Callback for when user typing in Input
   */
  onChangeInput: any,
}

/**
 * Generic input component.
 */
export function Input({labelText, placeholder='', className='', value='', name='', htmlFor='', onChangeInput}:Props) {    
    return (
        <div>
            <label className='text-text-01-normal font-medium text-sm leading-5' htmlFor={htmlFor}>
                {labelText}
            </label>
            <div className="relative">
                <input
                    id={htmlFor}
                    className={[
                        "relative w-64 pl-3 h-8 py-2 border rounded bg-ui-03 border-ui-06 text-text-01-normal leading-5 text-sm text-left hover:bg-ui-03 hover:border-ui-07 focus:bg-ui-03 focus:outline-none focus:border-interactive-01-active active:bg-ui-03",                        
                        className
                        ].join(' ')} 
                    placeholder={placeholder}
                    value={value}
                    name={name}
                    onChange={ (e) => { onChangeInput(e.target.value) }}
                />
            </div>
        </div>
    )
}   

然后在我的故事书文件中,我希望有一个钩子useState for localValue, when onChangeInput作为传递到自定义输入组件的方法,来自输入的本机 onChange 将开始让它 setState 为 localValue ,因此我的自定义输入组件可以在用户键入时显示输入值...

输入.stories.tsx

import React, { useState } from 'react';
import { Story, Meta } from '@storybook/react';
import { withDesign } from 'storybook-addon-designs'

import { Input, Props } from './Input';

const [localValue, setValue] = useState<string>('');
const onChangeInput = (inputValue: string) => {
    console.log(inputValue);
    setValue(inputValue);
}

export default {
  title: 'General/Input',
  component: Input,
  decorators: [withDesign],
  parameters: {
    design: {
      type: 'figma',
    },
  },
} as Meta;

const Template: Story<Props> = (args:Props) => <Input {...args} />;

export const Default: Story<Props> = Template.bind({});
Default.args = {
  labelText: 'Label',
  placeholder: 'Placeholder',
  name: 'test-name',  
  htmlFor: 'test-for',
  value: localValue,
  onChange: onChangeInput,
} as Partial<Props>;
Default.parameters = {
  design: {
    url: 'https://www.figma.com/to-some-design-url'
  }
}

但不幸的是我无法让它工作,所以在这里寻求帮助,请用代码示例建议,谢谢


经过我自己一番调查。 Input.tsx 文件没有任何问题。 只是对故事书有些误解。 以下是解决方案,效果很好,对于将来搜索相同问题的任何人,请随时复制粘贴到您自己的项目中:) 谢谢

import React, { useState } from 'react';
import { Story, Meta } from '@storybook/react';
import { withDesign } from 'storybook-addon-designs'

import { Input, Props } from './Input';

export default {
  title: 'General/Input',
  component: Input,
  decorators: [withDesign],
  parameters: {
    design: {
      type: 'figma',
    },
  },
} as Meta;

const Template: Story<Props> = () => {    
    const [localValue, setValue] = useState<string>('');
    const onChangeInput = (inputValue: string) => {
        setValue(inputValue);
    }
    return (
        <Input 
            labelText='Label'
            placeholder='Placeholder'
            className='test-class-name'
            name='test-name'            
            value={localValue}
            htmlFor='test-for'
            onChangeInput={ onChangeInput }
        />
    )
}

export const Default: Story<Props> = Template.bind({});
Default.parameters = {
  design: {
    url: 'https://www.figma.com/link-to-design'
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Typescript 故事书通过 onChange 回调实现自定义输入组件,然后将 State 值返回到输入 的相关文章

  • 我们可以在打字稿中访问另一个类中的私有变量吗

    class Animal private name string public Firstname string constructor theName string this name theName this Firstname the
  • React 状态总是从 Fabricjs 的回调中返回先前(或初始)状态

    下面的代码是我的最小问题重现组件 它初始化织物画布 并处理 模式 状态 模式状态决定画布是否可以编辑 并且一个简单的按钮控制该状态 问题是 即使mode setMode工作正常 意思是 单击按钮后组件分析器显示正确的状态 按钮内的文本也显示
  • VSCode 在 React 的 JSX 中错误地格式化三进制

    我正在运行 VSCode 来开发我的 React 应用程序 我有一个简单的三元 isLoading
  • 从react-loadable中命名webpack块

    我已经成功在我的项目中添加了react loadable库以启用代码分割 我发现的唯一问题是webpack生成的块没有命名 它们被赋予了整数名称 我的反应可加载使用代码是 const AppRootLoadable Loadable loa
  • ReactJS setState 仅在嵌套在 setState 中时才有效

    问题 当我使用 this setState 并在回调中输出状态时 它根本不会改变 但是当我将 setstate 嵌套在 setstate 中时 它将正常工作 例子 这不行 this setState data newData 这确实有效 t
  • 从外部material-ui组件访问主题

    我有一个使用标准深色主题的主题提供商 我希望能够从我自己的自定义组件访问该主题的详细信息 但我不知道如何做到这一点 在下面的例子中 this props theme未定义 ReactDOM render
  • 如何使用 JSX 和 Lodash 重复一个元素 n 次

    我在我的应用程序中使用 React JSX 和 Lodash 来实现我想要的 我需要根据条件重复某个元素一定次数 我该怎么做呢 这是元素 span span 我这样分配它 let card if data hand 8 or more ca
  • 在打字稿中通过 this 从派生类型调用构造函数

    在我的打字稿中 我尝试通过基类中的方法创建 克隆子对象 这是我的 简化的 设置 abstract class BaseClass
  • Typescript - 联合类型

    我创建了以下界面 export interface Message date Timestamp Date interface Timestamp seconds number nanoseconds number 不知道为什么 我收到以下
  • 为什么在 ES6 中不应该使用 import all

    所以我最近开始学习 React 并注意到所有文档都有类似的导入 import Apples Bananas Oranges from fruits 但是在研究 React 时我发现这种语法也同样有效 import as Fruits fro
  • 如何使用 Next Script 精确控制脚本标签的插入位置

    我目前正在尝试将第三方脚本添加到我的 Next js 应用程序中 该脚本会在脚本标签正下方插入一个 iframe 所以我需要精确控制脚本标签在页面上的位置 我目前正在使用下一个 脚本 https nextjs org docs api re
  • 如何将 create-react-app 与较旧的 React 版本一起使用?

    使用时创建反应应用程序 https github com facebookincubator create react app with 自定义反应脚本 https github com kitze custom react scripts
  • 如何将值从孩子的孩子传递给父母?

    我有一个父组件 有一个子组件 它也有一个子组件 Parent Child One child of parent Child Two child of child 当在子二中定义一个值时 我使用回调将该值传递给子一 但我也想将相同的值传递回
  • 在请求标头中设置 Cookie Angular2

    我是 angular2 的新手 我的服务器 spring 在其响应标头中使用 set cookie 值来响应身份验证 如何将该 cookie 设置为下一次 API 调用的请求标头 我搜索了很多 但找不到合适的解决方案 作为http get
  • 如何在 getStaticPaths 内添加 params 值数组

    我有一个页面 其结构如下 read slug number 我想要得到slug每个对应的值number in the getStaticPaths这是代码 export async function getStaticPaths const
  • 避免对象突变

    我正在使用 React 和 ES6 所以我遇到了以下情况 我有一个带有对象数组的状态假设a id 1 value 1 id 2 value 2 处于以下状态Object A 然后我将列表传递给Object B通过道具 Object B 在构
  • 如何在 Angular2 中为表单分配和验证数组

    我的模型 this profile 在 javascript 中有一个属性叫做emails 这是一个数组 email isDefault status 然后我将其定义如下 this profileForm this formBuilder
  • 调用axios成功后如何更新页面?反应

    所以我正在做一个使用的项目Axios with Json server 但我有一个问题 每次我做Patch 我必须在主页上按 F5 才能更新 我想知道如何才能做到这一点 这样它就不会自动发生 My Patch onSubmitDate ev
  • 如何在 ngrx/effects 中执行 if/else 操作?

    我正在使用 ngrx effects 我想根据以下情况分派不同的操作foo商店里的状态 这就是我现在正在做的 Effect foo1 this updates whenAction Actions FOO filter obj gt obj
  • Recoil 中的动态原子键

    我正在尝试创建一个动态表单 其中表单输入字段是根据 API 返回的数据呈现的 由于atom需要有一个唯一的键 我尝试将它包装在一个函数中 但是每次我更新字段值或重新安装组件 尝试更改选项卡 时 我都会收到一条警告 我在这里做了一个小的运行示

随机推荐

  • 跨平台一致的伪随机数

    我正在寻找一种生成伪随机数序列的方法 该方法将在任何平台上为给定种子生成相同的序列结果 我假设rand srand 不会是一致的 我的这个假设很容易是错误的 像一个Mersenne Twister 来自 Boost Random http
  • 如何在 glob() 模式中编写“或”?

    glob glob 不使用正则表达式 它使用 Unix 路径扩展规则 我如何在 glob 中模拟这个正则表达式 jpg png 很好glob你应该这样做 lst glob glob jpg glob glob png
  • SVN反向合并?

    我的 SVN 存储库在修订版 497 时非常完美 我执行了几次错误的提交 因此现在它处于修订版 HEAD 我发现要回滚 您应该使用如下命令 svn merge r HEAD 497 在工作目录中 并且工作目录位于 HEAD 修订版 但这是正
  • PHP 从字符串中获取搜索词数组

    有没有一种简单的方法来解析字符串以查找包括否定词在内的搜索词 this that the other thing but not this positive 会变成 array positive gt array this the othe
  • pytz 在 Mac 上安装

    Django 通知我 ImportError 没有名为 pytz 的模块 但是当我使用 pip 安装它时 我得到以下结果 Requirement already satisfied use upgrade to upgrade pytz i
  • MySQL通过数组中的键搜索json值

    我有一个 JSON 对象数组 想要返回一个特定的节点 为了简化我的问题 假设数组可能如下所示 Race Orc strength 14 Race Knight strength 7 例如 我想知道骑士的实力 功能JSON SEARCH ht
  • 通过函数打开流

    我需要有关不可复制性质的帮助 io f streams 我需要提供一个黑客包装fstreams 以便在 Windows 上处理文件名中包含 unicode 字符的文件 为此 我设计了一个包装函数 bool open ifstream ist
  • ImportError:在 apache 上安装 django mod_wsgi 配置中没有名为 django.core.handlers.wsgi 的模块

    我尝试安装 django 以与 apache 和 mod wsgi 一起使用 但出现此错误 ImportError No module named django core handlers wsgi 我读到这可能是用户错误 在控制台 ssh
  • 从 Redis 中删除会话 (Django)

    我使用 Django 和 Redis 作为会话引擎 也是 Celery 但那是别的东西 它运行完美 我可以看到速度的提高 SESSION ENGINE django contrib sessions backends cached db 我
  • 需要哪些 Visual C++ DLL?

    我不喜欢必须为使用 Microsoft 编译器编译的程序分发安装程序 我更喜欢使用与可执行文件打包在同一目录中的 DLL 那么 MSVC 2010 所需的 DLL 是什么 没有一个简单的答案 因为这取决于您在程序中构建的依赖项 您可能想使用
  • 在 Laravel 5 或 4.3 中包含 CSS

    TL DR 在 Laravel 5 中链接到样式表的正确方法是什么 背景 我使用 Laravel 4 3 5 的开发版本 因为我想使用 Socialite 从一开始就使用它进行开发是有意义的 我在从 4 2 传输模板时遇到问题 我已将刀片布
  • 跟踪 python:仅包含一些文件

    我知道我可以用它来跟踪命令执行 python m trace t script py 但我想减少输出 只应显示我的 src pip install e 中的文件 我怎样才能做到这一点 如果您正在运行脚本bash你可以使用类似的东西 pyth
  • 模块“tensorflow.python.keras.api._v2.keras.layers”没有属性“CuDNNLSTM”

    当我写作时tf keras layers LSTM 我收到警告 Note that this layer is not optimized for performance Please use tf keras layers CuDNNLS
  • PHP 有没有办法在 foreach 中重新启动循环,或更改 switch 中的测试值?

    如果我正在循环一个数组 并且在其中一个循环的中间我发现一些小问题 改变 一些东西 并且需要重试 有没有办法跳回到循环顶部而不从数组中获取下一个值 我怀疑这是否存在 但它会是一些关键字 例如continue or break 事实上 它很像c
  • C# 的 CSV 解析器/阅读器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 astropy.table.columns 转换为 numpy 数组

    我想绘制points points np random multivariate normal mean 0 0 cov 0 4 9 9 10 size int 1e4 print points 2 50584156 2 77190372
  • PostgreSQL 没有自增功能?

    我有一个用 Java 编写的测试应用程序 用于在 MySQL PostgreSQL Oracle 和 Firebird 数据库 除其他外 中创建索引和非索引表 难道只是 PostgreSQL 不允许自动增量功能的情况吗 如果没有 拥有索引列
  • 等待 alamofire 完成获取请求并创建对象[重复]

    这个问题在这里已经有答案了 我在等待一个对象制作完成后遇到问题 然后我希望更新我的用户界面 如果我运行该函数 它将立即出现索引错误 因为它试图从第一个对象中获取一些文本 而该对象尚不存在 任何人都可以帮助我吗 func getMovieDa
  • Android 中的身份验证

    我正在使用客户端 Android 应用程序开发基于 Django 的 Web 应用程序 在 Web 端 身份验证是借助存储在 cookie 中的会话 ID 完成的 默认的 Django 实现 但我无法弄清楚如何在 Android 客户端中对
  • React Typescript 故事书通过 onChange 回调实现自定义输入组件,然后将 State 值返回到输入

    我目前正在用故事书实现一个 React 定制输入组件 我希望实现的是这个定制的输入组件将需要几个参数 其中一个参数是onChangeInput 稍后它将负责为 输入值 设置状态值 下面是我的主要输入组件实现 输入 tsx import Re