模板文字 - 更改元素的内部 HTML(onInput 事件)
Template Literals - Changing the Inner HTML of an element (onInput event)
所以我以前从未使用过模板文字,但现在我需要使用一个模板,它似乎包含一个带有模板文字的表单
这是我的输入之一:
<input
type="number"
className="mf-input "
min="1900"
max="2099"
step="1"
id="curyear"
name="currentyear"
placeholder="${ parent.decodeEntities(`Current Year`) } "
onInput=${parent.handleChange}
aria-invalid=${validation.errors['currentyear'] ? 'true' : 'false'}
ref=${el => parent.activateValidation({"message":"This field is required.","minLength":1900,"maxLength":2099,"type":"by_character_length","required":false,"expression":"null"}, el)}
/>
<${validation.ErrorMessage}
errors=${validation.errors}
name="currentyear"
as=${html`<span className="mf-error-message"></span>`}
/>
我想做的是,在 onInput 方法中,我还想更改元素的 innerHTML,而不是处理验证:
<h2 class="elementor-heading-title elementor-size-default" id="curyeartext">Current Year</h2>
我已经尝试了好几个小时了,但还是无法正常工作。
编辑:事实证明,它们是模板文字而不是 reactJS
避免在 React 中设置 innerHTML,use state instead。这是因为如果 html 在 React 控制的节点中,React 将在重新渲染时覆盖您修改的 DOM。
export default function MyReactComponent() {
var [ currentInput, setCurrentInput ] = React.useState();
return <>
<input
type="number"
className="mf-input"
min="1900"
max="2099"
step="1"
name="currentyear"
onInput={(e) => setCurrentInput(e.target.value)}
value={currentInput}
/>
<h2 class="elementor-heading-title elementor-size-default" id="curyeartext">
{currentInput}
</h2>
</>;
}
但是,如果您遇到无法避免的情况,您可以通过仅指定一个 ref 来告诉 React 忽略一个节点——即没有其他道具或子 JSX:
export default function MyReactComponent() {
return <div ref={divRef => {
divRef.innerHTML = "Hello <b>world!</b>";
}} />
}
这种技术通常用于将非 React 特定的 JS 库集成到 React 中,因为您可以对该 DOM 节点的内容做任何您想做的事情。
我设法通过在 return:
上面添加一个函数来做到这一点
function myfunction() {
document.querySelector('#curyeartext').innerHTML = document.querySelector('#curyear').value;
document.querySelector('#lastyear').innerHTML = document.querySelector('#curyear').value-1;
document.querySelector('#yearbefore').innerHTML = document.querySelector('#curyear').value-2;
}
并在 onInput 事件处理程序中调用它
onInput=${myfunction}
所以我以前从未使用过模板文字,但现在我需要使用一个模板,它似乎包含一个带有模板文字的表单
这是我的输入之一:
<input
type="number"
className="mf-input "
min="1900"
max="2099"
step="1"
id="curyear"
name="currentyear"
placeholder="${ parent.decodeEntities(`Current Year`) } "
onInput=${parent.handleChange}
aria-invalid=${validation.errors['currentyear'] ? 'true' : 'false'}
ref=${el => parent.activateValidation({"message":"This field is required.","minLength":1900,"maxLength":2099,"type":"by_character_length","required":false,"expression":"null"}, el)}
/>
<${validation.ErrorMessage}
errors=${validation.errors}
name="currentyear"
as=${html`<span className="mf-error-message"></span>`}
/>
我想做的是,在 onInput 方法中,我还想更改元素的 innerHTML,而不是处理验证:
<h2 class="elementor-heading-title elementor-size-default" id="curyeartext">Current Year</h2>
我已经尝试了好几个小时了,但还是无法正常工作。
编辑:事实证明,它们是模板文字而不是 reactJS
避免在 React 中设置 innerHTML,use state instead。这是因为如果 html 在 React 控制的节点中,React 将在重新渲染时覆盖您修改的 DOM。
export default function MyReactComponent() {
var [ currentInput, setCurrentInput ] = React.useState();
return <>
<input
type="number"
className="mf-input"
min="1900"
max="2099"
step="1"
name="currentyear"
onInput={(e) => setCurrentInput(e.target.value)}
value={currentInput}
/>
<h2 class="elementor-heading-title elementor-size-default" id="curyeartext">
{currentInput}
</h2>
</>;
}
但是,如果您遇到无法避免的情况,您可以通过仅指定一个 ref 来告诉 React 忽略一个节点——即没有其他道具或子 JSX:
export default function MyReactComponent() {
return <div ref={divRef => {
divRef.innerHTML = "Hello <b>world!</b>";
}} />
}
这种技术通常用于将非 React 特定的 JS 库集成到 React 中,因为您可以对该 DOM 节点的内容做任何您想做的事情。
我设法通过在 return:
上面添加一个函数来做到这一点 function myfunction() {
document.querySelector('#curyeartext').innerHTML = document.querySelector('#curyear').value;
document.querySelector('#lastyear').innerHTML = document.querySelector('#curyear').value-1;
document.querySelector('#yearbefore').innerHTML = document.querySelector('#curyear').value-2;
}
并在 onInput 事件处理程序中调用它
onInput=${myfunction}