问题描述
我创建了一个下拉菜单,其中有几个选项供用户选择他们想要在渲染图上看到的单位格式。Dropdown and plot
我找不到更新绘图数据的方法,因此当用户选择下拉列表中的格式到 y 轴上的绘图编号时,数据会发生变化。
这是我目前的代码:
export const Chart = ({plotData}) => {
const [format,setFormat] = useState('')
const onChange = (e) =>{
setFormat(e.prevNum.value);
}
let pressureIndex = Array.from(
{length: plotData[0].pressureData.length},(_,i) => i + 1
)
const pressureLayout = {
...baseLayout,yaxis: {
title: {
text: 'Pressure at MS wellbore (Pa)',},}
function ChangeFormat(num,flag) {
if (num >= 1000000000 && flag === 'G') {
return (num / 1000000000).toFixed(1).replace(/\.0$/,'') + 'G';
}
if (num >= 1000000 && flag === 'M') {
return (num / 1000000).toFixed(1).replace(/\.0$/,'') + 'M';
}
if (num >= 1000 && flag === 'K') {
return (num / 1000).toFixed(1).replace(/\.0$/,'') + 'K';
}
return num;
}
const changeFormat = (num,exp="K",prec=1) => `${(num/{K:1000,M:1000000,G:1000000000}[exp])
.toFixed(prec)
.replace(/\.0$/,'')}${exp}`;
plotData.forEach((data) => {
pressureData.push({
y: data.pressureData.map(prevNum => prevNum /10e6),x: pressureIndex,type: 'scatter',mode: 'lines',marker: randomColor({hue: 'red',count: pressureIndex}),name: data.tag,})
})
pressureData.map(prevNum => prevNum)
const test = pressureData.map(prevNum => prevNum)
console.log(pressureData,"this is a test")
return (
<>
<Form>
<Dropdown
name={'unit format'}
label={'Unit Format'}
choices={{
Pascals: 'Pascals',Megapascals: 'Megapascals',Gigapascals: 'Gigapascals',Kilopascals: 'Kilopascals',}}
tip={'Select a unit to format'}
/>
</Form>
<Plot onChange={onChange} format={format} data={pressureData.map(prevNum => prevNum)} layout={pressureLayout} />
</>
)
}
export default Chart
下拉组件:
const Dropdown: FunctionComponent<DropdownProps> = (props) => {
const {
label,required,placeholder,name,register,rules,choices,onChange,tip,} = props
const [error,setError] = useState<string>()
const [showTip,setShowTip] = useState<boolean>(false)
const dropdown = (
<div className={'form__field'}>
{label && <Formlabel text={label} forID={name} />}
<select
id={name}
className={'form__dropdown'}
name={name}
defaultValue={placeholder}
required={required}
onChange={onChange}
ref={register({
...rules,})}>
{placeholder && <option value={''}>{placeholder}</option>}
{Object.entries(choices).map(([key,value],i) => {
return (
<option key={i} value={key}>
{value}
</option>
)
})}
</select>
</div>
)
return (
<>
<div className={'form__dropdown_wrapper'}>
{dropdown}
{tip && <ToolTip onClick={() => setShowTip(true)} />}
</div>
{showTip && <div className={'form__field_tip'}>{tip}</div>}
{error && <div className={'form__error'}>Error</div>}
</>
)
}
Dropdown.defaultProps = {
required: false,placeholder: '',}
type DropdownProps = {
name: string,label?: string,required?: boolean,placeholder?: string,rules?: object,register?: any,choices: object,onChange?: any,tip?: string,}
export default Dropdown
它不会更新。我做错了什么?
解决方法
你好吗?
我认为问题是因为您没有将 onChange
附加到 DropDown 组件。尝试将其更改为:
<>
<Form>
<Dropdown
name={'unit format'}
label={'Unit Format'}
choices={{
Pascals: 'Pascals',Megapascals: 'Megapascals',Gigapascals: 'Gigapascals',Kilopascals: 'Kilopascals',}}
tip={'Select a unit to format'}
/>
</Form>
<Plot onChange={onChange} format={format} data={pressureData.map(prevNum => prevNum)} layout={pressureLayout} />
</>
到:
<>
<Form>
<Dropdown
name={'unit format'}
label={'Unit Format'}
choices={{
Pascals: 'Pascals',}}
tip={'Select a unit to format'}
onChange={onChange}
/>
</Form>
<Plot format={format} data={pressureData.map(prevNum => prevNum)} layout={pressureLayout} />
</>
请注意,我从 Plot 组件中删除了 onChange 到 DropDown 组件,您可能会尝试聆听该组件。
编辑 1:
尝试将您的 onChange
事件更改为:
const onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setForm(e.target.value)
}
据我所知,您的 onChange 方法无法正确恢复新 DropDown 的选定值。