【问题标题】:Material Design Components Toggle effect not working材料设计组件切换效果不起作用
【发布时间】:2020-07-19 03:52:26
【问题描述】:

我正在尝试将材质组件 IconButton 与 React 一起使用。
材料设计:https://material-components.github.io/material-components-web-catalog/#/component/icon-button

它可以工作并显示元素并进行重复。但是切换不起作用。
这是我在 chrome 的 devtool 中的代码和元素树。
请教我解决方案。

import React, { useEffect } from 'react';
import { MDCIconButtonToggle } from '@material/icon-button';

const ButtonLike = () => {
  useEffect(() => {
    const iconToggle = new MDCIconButtonToggle(
      document.querySelector('.mdc-icon-button'),
    );
    iconToggle.on = true;
  });
  return (
    <button
      id="add-to-favorites"
      className="mdc-icon-button mdc-icon-button--on"
      aria-label="Add to favorites"
      aria-pressed="false"
    >
      <i className="material-icons mdc-icon-button__icon mdc-icon-button__icon--on">favorite</i>
      <i className="material-icons mdc-icon-button__icon">favorite_border</i>
    </button>
  );
};

export default ButtonLike;

元素树

<button id="add-to-favorites" class="mdc-icon-button mdc-icon-button--on" aria-label="Add to favorites" aria-pressed="false">
  <i class="material-icons mdc-icon-button__icon mdc-icon-button__icon--on">
    favorite
  </i>
  <i class="material-icons mdc-icon-button__icon">
    favorite_border
  </i>
</button>

【问题讨论】:

  • 怎么不行?它是保持“开启”还是什么?
  • 感谢您的提问,hackape。在这种情况下,它继续存在。因为“iconToggle.on”值设置为“true”。如果它更改为“false”,它就会保持关闭状态。
  • “关闭”表示显示“favorite_border”图标。单击该图标时,波纹效果起作用。我没有写但也添加了scss模块。而且看起来效果不错。

标签: javascript reactjs material-design


【解决方案1】:

您在useEffect() 中实例化iconToggle,但您忽略了useEffect() 接受第二个参数deps list 的事实。没有它,该逻辑会在每次重新渲染时重新运行,这意味着您的 iconToggle.on 每次都设置回 true,因此它保持在“开启”状态。

作为旁注,选择 HTML 元素的更 React-ish 方式是通过 useRef(),而不是 document.querySelector(),这可能会找到其他不需要的元素

import React, { useEffect, useRef } from 'react';
import { MDCIconButtonToggle } from '@material/icon-button';

const ButtonLike = () => {
  const buttonRef = useRef(null);

  useEffect(() => {
    const iconToggle = new MDCIconButtonToggle(buttonRef.current);
    iconToggle.on = true;
  }, []);  // <-- You need to pass in an empty array
           //     to signal that you want this logic to run only once.

  return (
    <button
      ref={buttonRef}
      id="add-to-favorites"
      className="mdc-icon-button mdc-icon-button--on"
      aria-label="Add to favorites"
      aria-pressed="false"
    >
  );
}

【讨论】:

  • 感谢您的回答!我更改了脚本并尝试了它,但结果没有改变。第一个脚本没有错误。还有其他问题吗?
  • 是的,我会的。我是编程初学者,所以我会在搜索codeandbox是什么之后发布。感谢您对 hackape 的大力帮助。
  • @MIsoku 我为你创建了一个,here我不确定你那边发生了什么,但我的代码可以工作。
  • 恭喜!我看到你的脚本在沙盒上工作。我很感激!我会尽量弄清楚我的脚本有什么不同。
  • 现在,我可以创建沙箱和代码here,等我找出两个代码之间的差异后,我会发布这个问题的意义所在。
猜你喜欢
  • 2016-06-28
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2019-11-27
  • 2015-10-10
  • 2020-02-09
  • 2017-02-01
相关资源
最近更新 更多