我试图解决testdome上的一个React问题.

这就是任务:

消息组件包含一个锚元素和锚下的一段.应通过使用以下逻辑单击锚点元素来切换段落的呈现:

At the start, the paragraph should not be rendered.
After a click, the paragraph should be rendered.
After another click, the paragraph should not be rendered.
Finish the Message component by implementing this logic.

这就是解决方案:

// React is loaded and is available as React and ReactDOM
// imports should NOT be used
class Message extends React.Component {
  
  constructor(props) {
    super(props);
    this.state = {
      visible: false
    };
  }
  
  clickHandler = (event) => {
    event.preventDefault();
    this.setState({
     visible: !this.state.visible   
    });
  }
  
  render() {
    return (<React.Fragment>
          <a onClick={this.clickHandler} href="#">Want to buy a new car?</a>
         { this.state.visible && <p>Call +11 22 33 44 now!</p>}
        </React.Fragment>);
  }
}

document.body.innerHTML = "<div id='root'> </div>";
  
const rootElement = document.getElementById("root");
ReactDOM.render(<Message />, rootElement);

console.log("Before click: " + rootElement.innerHTML);
document.querySelector("a").click();
console.log("After click: " + rootElement.innerHTML);

我想用useState钩子做同样的事情.这是我的代码:

// React is loaded and is available as React and ReactDOM
// imports should NOT be used
class Message extends React.Component {
  
  const [show, setShow] = useState(false);
  
  const toggleVisibility = () => {
    setShow(!show);
  }
  
  render() {
    if(show) {
       return (<React.Fragment>
          <a onClick={toggleVisibility} href="#">Want to buy a new car?</a>
          <p>Call +11 22 33 44 now!</p>
        </React.Fragment>);
  } else {
     return (<React.Fragment>
          <a onClick={toggleVisibility} href="#">Want to buy a new car?</a>
        </React.Fragment>);
  }
  }
    
}

document.body.innerHTML = "<div id='root'> </div>";
  
const rootElement = document.getElementById("root");
ReactDOM.render(<Message />, rootElement);

console.log("Before click: " + rootElement.innerHTML);
document.querySelector("a").click();
console.log("After click: " + rootElement.innerHTML);

这是输出:

Run OK, but 3 out of 3 test cases failed.

Line 5: SyntaxError: unknown: Unexpected token (5:8)

  3 | class Message extends React.Component {
  4 |   
> 5 |   const [show, setShow] = useState(false);
    |         ^
  6 |   
  7 |   const toggleVisibility = () => {
  8 |     setShow(!show);

Your score is 0% :(

为什么它不起作用?不允许在类组件中使用挂钩吗?

推荐答案

不能在基于类的组件中使用useState()钩子.为此,请切换到基于功能的组件.

您可以按如下方式创建功能组件????

import React, { useState } from "react";
import ReactDOM from "react-dom";

const Message = () => {
  const [show, setShow] = useState(false);

  const toggleVisibility = () => {
    setShow(!show);
  };

  return (
    <React.Fragment>
      <a onClick={toggleVisibility} href="#">
        Want to buy a new car?
      </a>
      {show && <p>Call +11 22 33 44 now!</p>}
    </React.Fragment>
  );
};

Reactjs相关问答推荐

有正确的方法来设置我的金牛座应用程序的图标吗?

在Reaction中测试条件组件

在下一个js中使用ESTAccountWithEmailAndPassword函数时循环

如何使我的代码可以接受我想要的每一个链接

是否为Reaction中未使用的组件生成Tailwincss样式?

svg每条路径上的波浪动画

React路由dom布局隐藏内容

在 React 中,为什么不将组件和钩子结合起来呢?

当我无法引用模态组件时,如何使模态组件在 Next.js/React 中管理自己的状态?

如何使用 React 获取表单中的所有值?

单击按钮不会切换组件(当按钮和组件位于两个单独的文件中时)

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

ReactJS中使用setState方法时,Context内部的State未进行更新

try 从 React JS 构建此教程游戏但无法继续前进

map 未显示在react 传单中

如何使图标适合 react-bootstrap 中的行元素

用 scss 覆盖 MUI

ClearInterval 在 React 中的 useRef 没有按预期工作

可以'读取未定义的属性(读取'路径')

用户输入值时更改值