javascript - React - 每次用户单击屏幕上的任意位置时更改元素文本的最佳方法是什么?

标签 javascript reactjs jsx

我已经开始学习 React,在阅读了文档之后,有一个问题..

我想做以下事情:

我想将文本呈现为组件的一部分。然后,当用户点击屏幕上的任意位置时,文本会发生变化,然后在第二次点击时再次改变,然后在第三次点击时再次改变,最后是第四次点击。

我想知道在 React 中执行此操作时的最佳实践是什么?我正在考虑使用“onClick”方法,但它只允许两种状态?

如果能在我的 React 之旅中提供帮助,我将不胜感激。

const welcome = <h1>Welcome to my app 1/4</h1>;

ReactDOM.render(
  welcome,
  document.getElementById('theapp')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="/styles.css">
  <title>Learn ReactJS</title>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

</head>

<body>
  <script src="https://s3.amazonaws.com/codecademy-content/courses/React/react-course-bundle.min.js"></script>
  <script src="/app.compiled.js"></script>

  <div id="theapp"></div>

</body>

</html>

最佳答案

因为您知道您正好需要 4 条消息,所以创建一个包含它们的数组。然后,在每次点击时更新一个计数器,然后使用该计数器从数组中获取相关项。

查看下面的演示。


关于 <h1> 的消息更改点击

这个片段有一个计数器/索引和一个数组,其中包含在初始状态下定义的要显示的消息。然后我们将事件监听器添加到 h1 元素以在点击时触发。这样做会增加索引,只要它不大于 2(此时没有更多消息可显示)。

class MyApp extends React.Component {
  constructor() {
    super();
    this.state = {
      messages: ["foo", "bar", "baz", "qux"],
      index: 0
    };
    this.incrementCounter = this.incrementCounter.bind(this);
  }
  
  incrementCounter() {
    if(this.state.index > 2) return;
    this.setState((prevState) => ({index: prevState.index + 1}));
  }
  
  render() {
    return <h1 onClick={this.incrementCounter}>{this.state.messages[this.state.index]}</h1>
  }
}

ReactDOM.render(<MyApp />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>


关于 window 的消息更改点击

与前面的示例类似,这里我们将监听器添加到窗口对象本身。我们需要在 componentDidMount 方法中执行此操作。

class MyApp extends React.Component {
  constructor() {
    super();
    this.state = {
      messages: ["foo", "bar", "baz", "qux"],
      index: 0
    };
  }

  componentDidMount() {
    window.addEventListener("click", function() {
      if(this.state.index > 2) return;
      this.setState((prevState) => ({index: prevState.index + 1}));
    }.bind(this));
  }
  
  render() {
    return <h1>{this.state.messages[this.state.index]}</h1>
  }
}

ReactDOM.render(<MyApp />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

关于javascript - React - 每次用户单击屏幕上的任意位置时更改元素文本的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47672536/

相关文章:

javascript - Antd/ react : Trying to style the 'extra' parameter of the Antd Collapse Panel element

javascript - react-redux-i18n 切换语言

reactjs - 通过在 React 中更改父组件的 Props 来更新子组件

android - React Native png 图像是像素化的而不是高清的

javascript - 使用 React-Laravel 相对于普通 React 和 Laravel 的优缺点

javascript - 带有文本参数的 Facebook 共享器链接

javascript - 自制图片轮播不循环

javascript - 如何根据 JavaScript 中的其他列值更改表格的列单元格颜色?

reactjs - 使用带有样式组件的 Material 系统的更好方法

JavaScript RegExp 忽略大小写标志与全局匹配标志