从 React 组件中查找并更改具体化生成的 html 个元素

Find and change materialize generated html elements from react component

在我的应用程序的几个地方,我有一些我不太引以为豪的代码。我需要找到一些由 materialize 处理的元素来操作它们,以便它们根据我的需要显示。 所以我在代码的两个不同部分做了这两件事:

// 1.- set style from grey (placeholder text) to black(input text) and erase placeholder only on 1rst  option select
const dropdownWrapper = document.getElementsByClassName('select-dropdown dropdown-trigger')[0];
dropdownWrapper.setAttribute("style", "color:black;");

// 2.- remove AM PM labels from display
let ampmLabels = document.getElementsByClassName('timepicker-span-am-pm')[0];
ampmLabels.setAttribute("style", "display:none;");

我不考虑 useRef,因为这些元素不属于任何特定组件。当我在我的组件中初始化物化元素时,它们位于 DOM 中,当我在我的组件中初始化物化元素时,它们被物化放在那里,当它们显示时,我从该组件操纵它们以满足我的需要。

据我所知,当我 运行 解码时不再有这种类型的元素,document.getElementsByClassName('select-dropdown dropdown-trigger')[0]; 可以工作,但是没有更优雅的方法来找到操作 dom 元素来做到这一点?

编辑:

无法更改颜色的组件是具有type="text"属性的输入类型:

html 与 dropdownWrapper.classList.add('text-black');:

<input class="select-dropdown dropdown-trigger text-black" type="text" readonly="true" data-target="select-options-ee9a6017-aef6-ecbf-c2a1-298693b77804">

html 与 dropdownWrapper.setAttribute("style", "color:black;");:

<input class="select-dropdown dropdown-trigger" type="text" readonly="true" data-target="select-options-ee9a6017-aef6-ecbf-c2a1-298693b77804" style="color: black;">

似乎因此 dropdownWrapper.classList.add('text-black'); 不起作用。这会将 text black 添加到 class="select-dropdown dropdown-trigger text-black" 中的 class 名称(注意末尾的 text-black)但不会更改文本颜色,即使 .text-black {color: black}被添加到 css 文件。

setAttribute 的样式更改,在 html 的末尾生成 style="color: black;",这似乎是实际改变颜色的内容。

你可以这样做:

function addClass(selector, className) {
  const element = document.querySelector(selector);
  element.classList.add(className);
}

/* maybe move these strings to constants, add comments*/
addClass('.select-dropdown.dropdown-trigger', 'text-black');
addClass('.timepicker-span-am-pm', 'hidden');

微小的改进:

长版:

const dropdownWrapper = document.querySelector('.select-dropdown.dropdown-trigger');
dropdownWrapper.classList.add('text-black');

const ampmLabels = document.querySelector('.timepicker-span-am-pm');
ampmLabels.classList.add('hidden');