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

React钩子:在不更改事件处理程序函数引用的情况下跨函数访问状态

封飞
2023-03-14
class SomeComponent extends React.Component{
    onChange(ev){
        this.setState({text: ev.currentValue.text});
    }
    transformText(){
        return this.state.text.toUpperCase();
    }
    render(){
        return (
            <input type="text" onChange={this.onChange} value={this.transformText()} />
        );
    }
}
    null

现在,如果我使用钩子重写这个组件:

function onChange(setText, ev) {
    setText(ev.currentValue.text);
};

function transformText(text) {
    return text.toUpperCase();
};

function SomeComponent(props) {
    const [text, setText] = useState('');

    return (
        <input type="text" onChange={onChange} value={transformText()} />
    );
}

现在的问题是,我需要分别将text传递给transformtextsettext传递给onchange方法。我能想到的可能的解决方案是:

  1. 在组件函数中定义函数,并使用闭包传递值。
  2. 组件函数中,将值绑定到方法,然后使用绑定的方法。

编辑:这不是useCallback在React中所做的重复吗?因为我试图找出如何实现类似于以前用类组件方式完成的效果,虽然UseCallback提供了一种实现方法,但对于可维护性问题来说,这并不理想。

共有1个答案

韶云瀚
2023-03-14

这是您可以构建自己的钩子的地方(Dan Abramov敦促不要使用术语“自定义钩子”,因为它使创建自己的钩子比复制/粘贴逻辑更难/更高级)提取文本转换逻辑

简单地从穆罕默德的回答中“删除”下面评论的代码。

function SomeComponent(props) {
  // const [text, setText] = React.useState("");

  // const onChange = ev => {
  //   setText(ev.target.value);
  // };

  // function transformText(text) {
  //   return text.toUpperCase();
  // }

  const { onChange, text } = useTransformedText();

  return (
    <input type="text" onChange={React.useCallback(onChange)} value={text} />
  );
}

并将其粘贴到一个新函数中(按照惯例,前缀为“use*”)。命名要返回的状态&回调(根据您的情况,可以作为对象或数组)

function useTransformedText(textTransformer = text => text.toUpperCase()) {
  const [text, setText] = React.useState("");

  const onChange = ev => {
    setText(ev.target.value);
  };

  return { onChange, text: textTransformer(text) };
}
function UpperCaseInput(props) {
  const { onChange, text } = useTransformedText();

  return (
    <input type="text" onChange={React.useCallback(onChange)} value={text} />
  );
}

function LowerCaseInput(props) {
  const { onChange, text } = useTransformedText(text => text.toLowerCase());

  return (
    <input type="text" onChange={React.useCallback(onChange)} value={text} />
  );
}
function App() {
  return (
    <div className="App">
      To Upper case: <UpperCaseInput />
      <br />
      To Lower case: <LowerCaseInput />
    </div>
  );
}
 类似资料:
  • 问题:在函数“selectmenu”中调用了React钩子“React.useEffect”,该函数既不是React函数组件,也不是自定义React钩子函数 目标:我只想在单击按钮时挂载组件('Component DidMount/WillUnmount)(使用useffect()),而不是在加载文件(或整个组件)时挂载 实际目标:我想在单击时选择(或突出显示)一个文件(自定义)。但是,当用户在文

  • 我试图在一个功能组件中调用一个API,它是一个反应挂钩,并基于结果,重新呈现组件的内容。下面是代码: 调用API的组件- 以下是功能: 我正在尝试获取状态数据,并根据数据重新渲染组件。这里处于调用外部API的操作中。 正在调用操作并成功获取数据,但我不确定为什么状态正在更新-我得到了以下错误- 在函数“setResults”中调用React钩子“useState”,该函数既不是React函数组件,

  • 问题内容: 注意:我在使用React Native时遇到了这个特定的问题,但是我想这也同样适用于React。 我有一个使用React.Component构建的React组件。我不需要设置状态,但是我有道具。我建议的语法如下: 我知道我可以使用函数来构造此组件,如下所示: 但是我更喜欢前者,因为我的组件会增长,可能会有状态等,我只想以相似的方式构建所有组件。 现在,我的linter抱怨拥有一个无用的

  • 我没有在FabricJS事件中获得更新的状态值,如object:modified、mouse:up等。。。但我可以在回调函数中设置状态值。 当我试图获取状态值时,它返回的是初始值,而不是更新后的值。 例子: 初始值为0。我使用setCount将值更新为1。每当我试图在回调函数中获取“count”时,它都返回0或初始值。 编辑: 我试图实现的是,每当对象修改(对于撤销,重做操作)时,我试图保存Fab

  • 我还没反应过来。我试图从REST APIendpoint发出GET请求,该endpoint应返回以下JSON: 要查询API,我使用以下代码: 我想创建一个函数,返回JSON中的注释列表。我最初的尝试如下: 但是,它给了我一个错误。从网上看,似乎大多数人的问题都可以通过将默认值设置为空字典来解决,但我已经在React钩子中这样做了。我很困惑为什么要发帖子。注释列表未定义。我还注意到,试图使用控制台

  • 我正在构建一个制表符视图,我不明白为什么useState钩子没有更新我的状态。我肯定这是件容易的事,但我在这里已经被难住了一段时间... 我可以看到onPress函数已启动,如果我注销,则item.label是正确的。但是,即使我硬编码参数,setState也不会更改。