使用钩子将类组件转换为函数式

Posted

技术标签:

【中文标题】使用钩子将类组件转换为函数式【英文标题】:Convert Class component to functional using hooks 【发布时间】:2021-05-31 02:49:18 【问题描述】:

我正在尝试使用钩子将其转换为功能组件,但没有运气。我该怎么做? (新的钩子)。我试图遵循文档,但我一定不理解它。这应该以相同的方式工作,但使用钩子的功能组件。

import React,  Component  from "react";
    const texts = [
  ['Text 1', 'blah', 'sdklfj'],
  ['Text 2', 'blah', 'sdklfj'],
  ['Text 3', 'blah', 'sdklfj'],
  ['Text 4', 'blah', 'sdklfj'],
];


export default class Testing extends Component 
  constructor(props) 
    super(props);
    this.state = 
      clickedText: [],
    ;
  

  handleClick = (i) => 
    this.setState( clickedText: texts[i] );
  ;

  render() 
    const  clickedText  = this.state;
    return (
      <div>
        texts.map((text, i) => (
          <button key=i onClick=() => this.handleClick(i)>
            Click me i + 1
          </button>
        ))
        clickedText.length > 0 && <p>I clicked on button with text:</p>
        <ul>
          clickedText.map((t, i) => (
            <li key=`text-$i`>t</li>
          ))
        </ul>
      </div>
    );
  

【问题讨论】:

【参考方案1】:
import React,  useState  from 'react';

const texts = [
    ['Text 1', 'blah', 'sdklfj'],
    ['Text 2', 'blah', 'sdklfj'],
    ['Text 3', 'blah', 'sdklfj'],
    ['Text 4', 'blah', 'sdklfj'],
];

const Testing = (props) => 
    // useState is the function component equivalent of the inherited 'setState'
    const [clickedText, setClickedText] = useState([]);

    const handleClick = (i) => 
        setClickedText(texts[i]);
    ;

    return (
        <div>
            texts.map((text, i) => (
                <button key=i onClick=() => handleClick(i)>
                    Click me i + 1
                </button>
            ))
            clickedText.length > 0 && <p>I clicked on button with text:</p>
            <ul>
                clickedText.map((t, i) => (
                    <li key=`text-$i`>t</li>
                ))
            </ul>
        </div>
    );
;

export default Testing;

【讨论】:

点击Cannot read property 'handleClick' of undefined无效 抱歉,忘记const 谢谢,这是有道理的,有时我必须自己重复几次。我知道我自己搞砸了。 onClick=() =&gt; this.handleClick(i) 是错误的。删除this【参考方案2】:

首先,您需要将类组件中的当前状态替换为功能组件的useState 特性。另请阅读关于在功能组件中使用状态的 doc。 sandbox

import React,  useState  from "react";

const texts = [
  ["Text 1", "blah", "sdklfj"],
  ["Text 2", "blah", "sdklfj"],
  ["Text 3", "blah", "sdklfj"],
  ["Text 4", "blah", "sdklfj"]
];

const Testing = (props) => 
  const [clickedText, setClickedText] = useState([]);

  const handleClick = (i) => 
    setClickedText(texts[i]);
  ;

  return (
    <div>
      texts.map((text, i) => (
        <button key=i onClick=() => handleClick(i)>
          Click me i + 1
        </button>
      ))
      clickedText.length > 0 && <p>I clicked on button with text:</p>
      <ul>
        clickedText.map((t, i) => (
          <li key=`text-$i`>t</li>
        ))
      </ul>
    </div>
  );
;

export default Testing;

【讨论】:

谢谢,这是有道理的,有时我必须自己重复几次。我知道我自己搞砸了。 这似乎比基于类的组件容易得多,但我喜欢同时学习。 是的,它比基于类的复杂得多【参考方案3】:

学习如何使用useState、useRef、useEffect。在您的示例中,您不需要 useEffect 但您将需要它。

这是带有钩子的代码:

import  useRef, useState  from "react";
import "./styles.css";

export default function App() 
   const [clickedText, setClickedText] = useState([]);
   const texts = useRef([
     ["Text 1", "blah", "sdklfj"],
     ["Text 2", "blah", "sdklfj"],
     ["Text 3", "blah", "sdklfj"],
     ["Text 4", "blah", "sdklfj"]
]);

const handleClick = (i) => 
   setClickedText(texts.current[i]);
 ;

 return (
    <div>
      texts.current.map((text, i) => (
         <button key=i onClick=() => handleClick(i)>
             Click me i + 1
         </button>
      ))
      clickedText.length > 0 && <p>I clicked on button with text:</p>
      <ul>
          clickedText.map((t, i) => (
             <li key=`text-$i`>t</li>
          ))
      </ul>
      </div>
 );
 

https://codesandbox.io/s/hidden-waterfall-s0t0m?file=/src/App.js

【讨论】:

谢谢,这是有道理的,有时我必须自己重复几次。我知道我自己搞砸了。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @Chris 添加了内联代码。谢谢你的警告。

以上是关于使用钩子将类组件转换为函数式的主要内容,如果未能解决你的问题,请参考以下文章

函数式组件

vue应用难点总结

反应:从类转换为具有状态的功能组件

vue 函数组件的应用及场景

[react] 类组件和函数式组件有什么区别?

将类隐式转换为 int 的正确方法是啥?