如何使用钩子将 React 类组件转换为功能组件

Posted

技术标签:

【中文标题】如何使用钩子将 React 类组件转换为功能组件【英文标题】:How to convert React class component to functional component with hooks 【发布时间】:2021-04-26 00:54:39 【问题描述】:

我正在 Reactjs 中创建一个降价预览器,用户在 textarea 标记中输入降价,转换后的降价显示在 div 标记中。目前,该项目在一个类组件中,我想知道如何将其转换为带有钩子的功能组件,因为在我拥有的另一个项目中实现它会更容易。我环顾四周,似乎找不到任何对我有很大帮助的东西,尤其是关于如何转换构造函数。任何帮助将不胜感激!

 export default class App extends React.Component 
      constructor(props) 
        super(props);
        this.state = 
          markdown: "",
        ;
      
    
      updateMarkdown(markdown) 
        this.setState( markdown );
      
    
      render() 
        return (
          <div className="App">
            <div className="container">
              <div className="row mt-4">
                <div className="col text-center">
                  <h1>
                    " "
                    <Badge className="text-align-center" variant="light">
                      Markdown Previewer
                    </Badge>
                  </h1>
                </div>
              </div>
    
              <div className="row mt-4">
                <div className="col-md-6">
                  " "
                  <div className="col text-center">
                    <h4>
                      <Badge className="text-align-center" variant="secondary">
                        Markdown Input
                      </Badge>
                    </h4>
                  </div>
                  <div className="input" style=inputStyle>
                    <textarea
                      className="input"
                      style=inputStyle
                      value=this.state.markdown
                      onChange=(e) => 
                        this.updateMarkdown(e.target.value);
                      
                    >
                    </textarea>
                  </div>
                </div>
    
                <div className="col-md-6">
                  " "
                  <div className="col text-center">
                    <h4>
                      <Badge className="text-align-center" variant="secondary">
                        Preview
                      </Badge>
                    </h4>
                  </div>
                  <div
                    style=outputStyle
                    dangerouslySetInnerhtml=
                      __html: marked(this.state.markdown),
                    
                  ></div>
                </div>
              </div>
            </div>
          </div>
        );
      
    

【问题讨论】:

【参考方案1】:

这样的事情应该可以工作:

const App = () => 
  const [markdown, setMarkdown] = React.useState('')

  return (
    <div className="App">
      ...other html
      <textarea
        value=markdown
        onChange=(e) => setMarkdown(e.target.value)
      </textarea>
      ...other html
    </div>
  )

对您来说最大的变化将是react state hook。希望我的示例清楚地展示了如何将类组件状态转换为反应钩子。您还可以将onChange 方法移动到返回上方的自己的函数中。比如……

const [markdown, setMarkdown] = React.useState('')

const handleChange = (e) => setMarkdown(e.target.value)

return (...)

【讨论】:

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

export default function App(props) 
  const [markdown, setMarkDown] = useState("");
  const updateMarkdown = (markdown) => 
    setMarkDown(markdown);
  

  return (
    <div className="App">
      <div className="container">
        <div className="row mt-4">
          <div className="col text-center">
            <h1>
              " "
              <Badge className="text-align-center" variant="light">
                Markdown Previewer
                </Badge>
            </h1>
          </div>
        </div>

        <div className="row mt-4">
          <div className="col-md-6">
            " "
            <div className="col text-center">
              <h4>
                <Badge className="text-align-center" variant="secondary">
                  Markdown Input
                  </Badge>
              </h4>
            </div>
            <div className="input" style=inputStyle>
              <textarea
                className="input"
                style=inputStyle
                value=markdown
                onChange=(e) => 
                  updateMarkdown(e.target.value);
                
              >
              </textarea>
            </div>
          </div>

          <div className="col-md-6">
            " "
            <div className="col text-center">
              <h4>
                <Badge className="text-align-center" variant="secondary">
                  Preview
                  </Badge>
              </h4>
            </div>
            <div
              style=outputStyle
              dangerouslySetInnerHTML=
                __html: marked(markdown),
              
            ></div>
          </div>
        </div>
      </div>
    </div>
  )

我在这里所做的是:

    用函数替换类 已删除构造函数 类方法在函数内部不起作用,因此将它们全部转换为函数(闭包)。 使用的 React 钩子 (useState)

【讨论】:

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

在 React 中将类组件转换为功能组件

如何将类组件转换为功能组件?

如何使用 React Hooks 将具有构造函数的类转换为功能组件?

如何使用 Async / Await 和 React 钩子?

react中从类重构为功能钩子组件

使用反应挂钩将基于类的组件转换为功能组件[重复]