Reactjs 我能';无法从React-Typescript组件上的onChange获取结果
我正在使用在应用程序中创建自定义组件。我的子组件由反应颜色的两个组件组成:CirclePicker和ChromePicker。两者都将colorPicker状态变量作为值共享。所以,如果一个改变了他的价值,另一个也会改变 正如您在我的子组件上看到的,我放置了一个不可见的输入,它共享相同的colorPicker值(我不知道它是否正确)。我的目标是:当输入改变时,我可以做一些事情,例如:警报(‘颜色改变’)(这是我在handleOnChange函数中的代码) 子组件:Reactjs 我能';无法从React-Typescript组件上的onChange获取结果,reactjs,typescript,onchange,Reactjs,Typescript,Onchange,我正在使用在应用程序中创建自定义组件。我的子组件由反应颜色的两个组件组成:CirclePicker和ChromePicker。两者都将colorPicker状态变量作为值共享。所以,如果一个改变了他的价值,另一个也会改变 正如您在我的子组件上看到的,我放置了一个不可见的输入,它共享相同的colorPicker值(我不知道它是否正确)。我的目标是:当输入改变时,我可以做一些事情,例如:警报(‘颜色改变’)(这是我在handleOnChange函数中的代码) 子组件: 从“React”导入React
从“React”导入React;
从“反应颜色”导入{CirclePicker,ChromePicker};
从“/../Icon/Icon”导入{Icon};
导入“./color picker.scss”;
导出接口ColorPickerProps{
onChange:(值:string)=>void;
}
导出函数ColorPicker(道具:ColorPickerProps){
const[colorPicker,showColorPicker]=React.useState(false);
const[finalColor,changeColor]=React.useState('#fff');
函数handleOnChange(){
警报(“颜色改变”);
道具更换(最终颜色);
}
返回(
handleOnChange}style={{display:“none”}/>
changeColor(colore.hex)}
颜色={[
“#004de8”,
“#2ecc71”,
#ff9300",,
"62708b",,
“#ff003a”,
"20396a"
]}
circleSize={24}
>
,但无论我做什么,都不会调用handleOnChange函数,也看不到警报
此外,我的目标是在父级中使用此组件,大致如下所示:
**父组件:**
this.state.color=e}/>
这样,我就可以在父状态下选择颜色
我无法在子函数中获取任何内容,也无法在父组件上更新状态
有人能帮我吗?我是React的新用户:(useCallback
可能是一个不错的选择,请参考此,然后
从“React”导入React;
从“react dom”导入react dom;
从“反应颜色”导入{CirclePicker,ChromePicker};
导入“/styles.css”;
功能应用程序(道具){
const[colorPicker,showColorPicker]=React.useState(false);
const[finalColor,changeColor]=React.useState(“#fff”);
const handleColorChange=React.useCallback(console.log(“通过回调工作”);
返回(
changeColor(colore.hex)}
颜色={[
“#004de8”,
“#2ecc71”,
“#ff9300”,
“#62708b”,
“#ff003a”,
“#20396a”
]}
circleSize={24}
/>
{颜色选择器(
changeColor(colore.hex)}
disableAlpha={true}
/>
) : (
""
)}
{finalColor}
);
}
const rootElement=document.getElementById(“根”);
ReactDOM.render(useCallback
可能是一个不错的选项,请参阅此,然后
从“React”导入React;
从“react dom”导入react dom;
从“反应颜色”导入{CirclePicker,ChromePicker};
导入“/styles.css”;
功能应用程序(道具){
const[colorPicker,showColorPicker]=React.useState(false);
const[finalColor,changeColor]=React.useState(“#fff”);
const handleColorChange=React.useCallback(console.log(“通过回调工作”);
返回(
changeColor(colore.hex)}
颜色={[
“#004de8”,
“#2ecc71”,
“#ff9300”,
“#62708b”,
“#ff003a”,
“#20396a”
]}
circleSize={24}
/>
{颜色选择器(
changeColor(colore.hex)}
disableAlpha={true}
/>
) : (
""
)}
{finalColor}
);
}
const rootElement=document.getElementById(“根”);
ReactDOM.render(解释
输入的值链接到状态。因此,当状态更改时,值会更改。但是,没有对输入触发任何事件。您试图对未触发任何事件的输入使用react;意思是handleOnChange
从未调用过Soprops。onChange
从未调用过
解决方案
用于侦听输入的值/状态值何时更改。如果使用,则可以在组件装载时停止运行props.onChange
。请查看
import*as React from“React”;
从“react”导入{FunctionComponent、useState、useffect、useRef};
从“react dom”导入{render};
从“反应颜色”导入{CirclePicker,ChromePicker};
常量颜色=[
“#004de8”,
“#2ecc71”,
“#ff9300”,
“#62708b”,
“#ff003a”,
“#20396a”
];
导出接口ColorPickerProps{
onChange:(值:string)=>void;
}
常量颜色选择器:FunctionComponent=({onChange})=>{
const[colorPicker,showColorPicker]=useState(false);
const[finalColor,changeColor]=useState(“#fff”);
const componentMounted=useRef(true);
useffect(()=>{
if(组件安装。当前){
componentMounted.current=false;
console.log(
“当使用useRef装载组件时,不要运行props.onChange”
);
}否则{
onChange(最终颜色);
警报(“最终颜色通过useEffect更改”);
}
return()=>未定义;
},[最终颜色];
返回(
changeColor(colore.hex)}
颜色={colors}
circleSize={24}
/>
showColorPicker(!colorPicker)}>单击我
{颜色选择器&&(
changeColor(colore.hex)}
disableAlpha={true}
/>
)}
);
};
const rootElement=document.getElementById(“根”);
渲染(
{
console.log(“onChange”);
}}
/>,
根元素
);
说明
输入的值链接到状态。因此,当状态更改时,值也会更改。但是,没有对输入触发任何事件。您试图对没有触发任何事件的输入使用react
import React from "react";
import ReactDOM from "react-dom";
import { CirclePicker, ChromePicker } from "react-color";
import "./styles.css";
function App(props) {
const [colorPicker, showColorPicker] = React.useState(false);
const [finalColor, changeColor] = React.useState("#fff");
const handleColorChange = React.useCallback(console.log("Work via callback"));
return (
<div className="relative-position">
<input value={finalColor} onChange={console.log("Work directly")} />
<input value={finalColor} onChange={handleColorChange} />
<CirclePicker
color={finalColor}
onChangeComplete={colore => changeColor(colore.hex)}
colors={[
"#004de8",
"#2ecc71",
"#ff9300",
"#62708b",
"#ff003a",
"#20396a"
]}
circleSize={24}
/>
{colorPicker ? (
<span className="chrome-picker">
<ChromePicker
color={finalColor}
onChangeComplete={colore => changeColor(colore.hex)}
disableAlpha={true}
/>
</span>
) : (
""
)}
<p>{finalColor}</p>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
import * as React from "react";
import { FunctionComponent, useState, useEffect, useRef } from "react";
import { render } from "react-dom";
import { CirclePicker, ChromePicker } from "react-color";
const colors = [
"#004de8",
"#2ecc71",
"#ff9300",
"#62708b",
"#ff003a",
"#20396a"
];
export interface ColorPickerProps {
onChange: (value: string) => void;
}
const ColorPicker: FunctionComponent<ColorPickerProps> = ({ onChange }) => {
const [colorPicker, showColorPicker] = useState(false);
const [finalColor, changeColor] = useState("#fff");
const componentMounted = useRef(true);
useEffect(() => {
if (componentMounted.current) {
componentMounted.current = false;
console.log(
"Don't run props.onChange when the component mounts with useRef"
);
} else {
onChange(finalColor);
alert("finalColor changed via useEffect");
}
return () => undefined;
}, [finalColor]);
return (
<div className="relative-position">
<input type="text" value={finalColor} style={{ display: "none" }} />
<CirclePicker
color={finalColor}
onChangeComplete={colore => changeColor(colore.hex)}
colors={colors}
circleSize={24}
/>
<br />
<button onClick={() => showColorPicker(!colorPicker)}>click me</button>
{colorPicker && (
<span className="chrome-picker">
<ChromePicker
color={finalColor}
onChangeComplete={colore => changeColor(colore.hex)}
disableAlpha={true}
/>
</span>
)}
</div>
);
};
const rootElement = document.getElementById("root");
render(
<ColorPicker
onChange={() => {
console.log("onChange");
}}
/>,
rootElement
);