当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中创建让我处理事件的React组件?

杨高翰
2023-03-14

我想在React中使用TypeScript创建一个自定义组件,它本质上是一个组合框,具有自动完成/搜索功能,连接到自己的远程存储。我想做的是发送一个“onSelect”事件,这样我就可以在我的应用程序中使用该组件的任何地方接收选定的项目。

使用远程商店进行自动完成/搜索很容易,但React组件的工作让我感到困惑。我仍然在学习这两种方法,所以我可能在爬之前就尝试着走路,但我不想一开始就制造混乱,因为我知道应该可以实现更优雅的结果。我只是想找些指南,但到目前为止我还没有找到。

以下是我想实现的目标:

<MyCombobox onSelect={handleSelect} />

handleSelect功能将在我需要使用MyCombobox组件的整个应用程序中使用。当然,函数需要接受一个参数(这就是我目前在TS中遇到的问题)。

共有2个答案

姚和顺
2023-03-14

从我今天早上做的所有谷歌搜索中,我成功地拼凑出了一些有用的东西(从大量来源):

App.tsx:

import React from 'react';
import './App.css';

import MyCombobox from './MyCombobox';

class App extends React.Component {

    receiveSomething(something: string) {
        alert('Something: ' + something);
    }

    render() {
        return (
            <div>
                <MyCombobox receiveSomething={this.receiveSomething} defaultValue="qwerty" />
            </div>
        );
    }
}

export default App;

MyCombobox.tsx:

import React from 'react';

export interface IMyCombobox {
    defaultValue: string,
    receiveSomething:(name:string) => void
}

class MyCombobox extends React.PureComponent<IMyCombobox, any> {

    state = {
        something: this.props.defaultValue
    }

    sendSomething() {  
        this.props.receiveSomething(this.state.something);  
    }

    handleChange = (event: any) : void => {
        this.setState({ 
            something: event.target.value
        });
    }

    render() {
        return (
            <div>
                <input 
                    type='text'
                    maxLength={20}
                    value={this.state.something} 
                    onChange={this.handleChange} />

                <input 
                    type='button' 
                    value='Send Something'
                    onClick={this.sendSomething.bind(this)} />
            </div>
        )
    }
}

export default MyCombobox;
李耀
2023-03-14

一种可能的解决方案如下

import * as React from "react";
import { render } from "react-dom";

interface MyComboProps {
    // Here props from parent should be defined
}

interface MyComboState {
    ValuesToShow: string[];
    SearchValue: string;
}

class StringSearchMenu extends React.Component<MyComboProps, MyComboState> {
    constructor(p: MyComboProps) {
        super(p);
        this.state = {
            ValuesToShow: [],
            SearchValue: ""
        };
    }

    protected selectString(event: React.ChangeEvent<HTMLInputElement>): void {
        let value = event.target.value;
        if (value === "") this.setState({ ValuesToShow: [] });
        else {
            /* here you can put fetch logic. I use static array as example */
            let possibleValues = ["Green", "Red", "Blue", "Yellow", "Black"];
            this.setState({
                ValuesToShow: possibleValues.filter(f => f.indexOf(value) > -1)
            });
        }
    }

    render() {
        return (
            <div>
                Enter value to search {"   "}
                <input onChange={this.selectString.bind(this)} />
                <div>
                    {this.state.ValuesToShow.map(v => (
                        <div>{v}</div>
                    ))}
                </div>
           </div>
      );
      }
}

这里是一个有效的例子

 类似资料:
  • 主要内容:实例,向事件处理程序传递参数React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同: React 事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM 元素的写法) HTML 通常写法是: React 中写法为: 在 React 中另一个不同是你不能使用返回 false 的方式阻止默认行为, 你必须明确使用 preventDefa

  • 我用React构建了3个组件。他们是: 包装器 列表 列表项 如何管理单击的复选框的状态。我想Wrapper知道哪些复选框被选中。

  • 问题内容: 我有一个在React中创建的组件,该组件可以抽象出我的应用程序中的某些样式。我在两种不同的上下文中使用它- 一种用于提交登录表单,另一种用于导航到注册页面(以及将来可能的其他上下文)。 我试图弄清楚如何将事件处理程序从父组件传递到。我想为登录表单调用一个处理程序,但是为导航按钮调用一个处理程序。这可能吗? 我试过像这样调用组件: 我也尝试过删除arrow函数,这只会导致该函数在加载组件

  • 我正在尝试为现有的无状态 React 组件套件创建类型定义,这样我就可以自动生成文档并改进团队工具中的智能感知。 组件示例如下所示: 我的组件.js 我希望我的类型定义为: 定义哪些道具是允许的(哪些是必需的) 它将返回JSX 查看这个使用TypeScript创建React组件的示例,我发现了类型:< code>React。SFC。 我试着在我的定义中使用这个: 索引.d.ts 但是我收到 我对T

  • 我最近在做一个程序,可以让用户上传自己的肖像。所以我使用文件输入并重写onchange函数。在onchange函数中,我新建了一个image对象,当image对象准备就绪时,我使用图像的宽度和高度以及src来设置IMG的拟合宽度和高度。下面的代码在chrome中运行良好,但在IE10中失败了。addEventListener和attachEvent在IE10中均失败。我只想让img处理onload

  • 问题内容: 我正在将React.js与TypeScript一起使用。有什么方法可以创建从其他组件继承但具有一些其他道具/状态的React组件? 我想要达到的目标是这样的: 但是,如果我把这个会失败中,我得到一个错误的打字稿(类型的参数是不能分配给类型)。我想这不是TypeScript专用的东西,而是将继承与泛型(?)混合使用的一般限制。是否有任何类型安全的解决方法? 更新 我选择的解决方案(基于D