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

React-使用onClick和onMouseover事件更新样式

有骏祥
2023-03-14

我正在创建一个评级系统来给图片评级。我想将onClick和onMouseOver事件应用到我为系统渲染的星星上。

onMouseOver:根据鼠标悬停的星星,应该填充星星以及悬停的星星之前的星星。如果我把星星留在div容器里,那么就不会填满星星。例如,对于4颗星,如果我悬停在第3颗星上,那么应该填写1-3颗星。如果我不悬停在任何星星上,就不应该填充任何星星。

onClick:与上面类似,除了星星将被填充,无论是悬停在星星上方还是远离星星。例如,点击星号3,将填写星号1-3。应保持填写状态,并禁用onMouseOver/onMouseLeave效果。

代码链接:https://codesandbox.io/s/k0zmr3m8po

Function to render stars
class Stars extends Component {
    constructor() {
    super()

    this.state = {
      ratingScore: 0,
      starsOnHover: 0
    }

    this.handleOnHoverStars = this.handleOnHoverStars.bind(this)
    this.clearRatingScore = this.clearRatingScore.bind(this)
    this.updateRatingScore = this.updateRatingScore.bind(this)
  }

  handleOnHoverStars(e) {
    e.preventDefault()
    this.setState({
      starsOnHover: e.currentTarget.id
    })
  }

  clearRatingScore(e) {
    e.preventDefault()
    this.setState({
      starsOnHover: 0
    })
  }

  updateRatingScore(e) {
    e.preventDefault()
    this.setState({
      ratingScore: e.currentTarget.id
    })
  }

  renderRatingStars() {
    let stars = []
    for (let i = 0; i < 4; i++) {
      stars.push(
        <a href="#"
          key={i}
          id={i+1}
          onMouseOver={this.handleOnHoverStars}
          onMouseLeave={this.clearRatingScore}
          onClick={this.updateRatingScore}
        >
          <svg width="38" height="36" viewBox="0 0 38 36" preserveAspectRatio="xMidYMid meet">
            <path d="M19.022 29.348L7.577 35.394l2.186-12.806-9.26-9.069L13.3 11.651 19.022 0l5.723 11.65 12.796 1.87-9.26 9.068 2.186 12.806z" fill={i < this.state.starsOnHover ? "#000": "#fff"} stroke="#c2c2c2" strokeWidth="1" fillRule="evenodd"></path>
          </svg>
        </a>
      )
    }
    return stars
  }

  render() {
    return (
      <div>{this.renderRatingStars()}</div>
    )
  }
}

到目前为止,我已经通过更新状态并检查我当前悬停在哪颗星星上来使用 onMouseEnter 和 onMouseLeave,从而更新我的 svg 元素的填充道具样式。我遇到困难的地方是调用 onClick 事件,并确保悬停事件不会覆盖样式,因为 onClick 应该胜过鼠标切换/鼠标左转。我正在考虑为svg元素的填充支撑分配一个函数,该函数将根据是否单击星星返回三元表达式,但不确定是否可以返回三元表达式。

共有1个答案

欧阳正卿
2023-03-14

我对您的代码进行的唯一更改是将svg组件中的填充属性更改为以下内容

填充={i

这将检查每颗星星的ID与状态,并填写它,如果

  1. 它小于悬停恒星的id
  2. 它小于点击的星星的ID

希望这就是你想要实现的目标。

 类似资料:
  • 输入字段未更新城市使用状态。我也试过提交,但结果是更多的错误。有时,当我按下提交按钮时,useEffect会刷新整个页面。

  • 本文向大家介绍onmouseover事件和onmouseout事件全面理解,包括了onmouseover事件和onmouseout事件全面理解的使用技巧和注意事项,需要的朋友参考一下   这两天接触了onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的描述,下面让我们

  • 问题内容: 我正在使用reactjs路由器中的Link组件,但无法使onClickevent运行。这是代码: 这是做这件事的方式还是另一种方式? 问题答案: 您以字符串形式传递,也意味着立即执行。 尝试

  • 问题内容: 我正在尝试将onClick事件添加到现有的svg。现在我有这个: 这 有点 起作用,但不完全是…当我单击该组时会触发该事件,但是可单击的“区域”与我想要可单击的组不同(在我看来,这是完全随机的)。 有没有更好的方法来向元素添加事件(使用React?)? 问题答案: 甲元件是一个空的容器; 它本身不能触发事件。 如果运行此示例,将会看到可以通过单击元素的子级来触发事件,但是如果单击它们之

  • 问题内容: 没有参数 带参数 我想得到。我怎么才能得到它? 问题答案: 试试这个: 并在您的职能: