【发布时间】:2021-05-17 04:58:13
【问题描述】:
我在下面有一个图表和一个输入字段。基本上用户可以提出问题,图表会相应地改变。这是它的样子
这是下面的代码示例(忽略 CoreUI 语法)
<CRow>
<CCol xs="12" sm="12" lg="12">
<CCard id="answerScreen" style={{height: "500px"}}>
{
!tempResponse.loading? tempResponse.data.map(value => (
<ChartRender
key={uuidv4()}
data={value}
/>
))
:
<Loader/>
}
</CCard>
</CCol>
</CRow>
<CRow>
<CCol xs="12" sm="12" lg="12">
<CCard>
<CCardBody>
<CForm className="form-horizontal">
<CFormGroup>
<CInputGroup size="lg" className="input-prepend">
<CInputGroupPrepend>
<CInputGroupText className="">@Ask</CInputGroupText>
</CInputGroupPrepend>
<CInput
size="16"
type="text"
value={userInput || ""}
onChange={e=> handleTextBoxInput(e)}
onClick={e=> handleTextBoxClick(e)}
onKeyPress={e => handleTextBoxEnter(e)}
id="userQuery"
/>
<CInputGroupAppend>
<CButton color="primary">Send</CButton>
</CInputGroupAppend>
</CInputGroup>
</CFormGroup>
</CForm>
</CCardBody>
</CCard>
</CCol>
</CRow>
这就是我定义状态的方式
const [userInput, setUserInput] = React.useState("");
const [tempResponse, setTempResponse] = React.useState({
data: []
})
我怀疑这部分代码有问题
<CInput
size="16"
type="text"
value={userInput || ""}
onChange={e=> handleTextBoxInput(e)}
onClick={e=> handleTextBoxClick(e)}
onKeyPress={e => handleTextBoxEnter(e)}
id="userQuery"
/>
我什至尝试像这样将useCallback 添加到onChange 函数
const handleTextBoxInput = useCallback(e =>{
e.preventDefault();
setUserInput(e.target.value)
}, [])
但没有帮助。我什至读过memo,但不确定在我的情况下在哪里或如何应用它。我做错了什么?
观察
正如@Matthew 所提到的,箭头语法每次都会创建一个不同的回调,这会导致重新渲染,因此必须删除。
但即使在删除它之后,每次按下一个键时图表都会重新呈现。我正在使用Chartjs,它在内部使用canvas。 Chartjs 有问题吗?
【问题讨论】:
-
使用 onBlur 比 onChange 更适合您吗?
-
@devnull69 关于使用 onBlur,我不能再在文本框中输入了。
-
函数的绑定方式不会导致它重新渲染。这就是为什么它不能解决你的问题。引用您的函数是一种很好的做法,但这不是您的问题。
标签: reactjs react-functional-component react-memo