我有React
个功能组件Input
,它是一个简单的input
字段,只需要一个名为prop
的{{1}},其值epoch
以毫秒为单位。在组件内部,我使用epoch
js将此时间格式化为moment
(hour:min)格式,同时我也在HH:mm
组件内部使用useState
进行设置在用户更新需要使用复杂算法检查的输入并需要在数字后加上+/-时,Input
的值。
input
Input.jsx
如您所见,我正在使用Internal状态来更新输入的值,而是直接使用prop,因为我需要在用户键入时将一些字符串连接到该值。
我将从父组件发送import React, {useState, } from 'react'
import moment from 'moment'
function Input({epoch}){
console.log(epoch)
const translateValueToString = epochValue => {
return moment(epochValue).format('HH:mm')
}
const [value, updateValue] = useState(translateValueToString(epoch))
return <input value={value} onChange={(e) => {
// i need to update the value with some complex calculation and update it
updateValue(`${e.target.value}+2`)
}}/>
}
export default Input
值作为paren组件中的propaslo,我有一个按钮来将epoch
的值更新为每次点击+1分钟。
epoch
App.jsx
我希望每次点击都应使用更新后的import React, {useState} from "react";
import "./styles.css";
import Input from './Input'
import moment from 'moment'
export default function App() {
const [epoch, updateEpoch] = useState(moment().valueOf())
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<Input epoch={epoch}/>
<button onClick={() => {
updateEpoch(epoch+60000)
}}>ADD 1 min</button>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
属性值来更新输入值。但这不会发生。输入中的epoch
不会触发。
已更新
我无法在Input函数中使用useState
,因为我使用useEffect
,所以它会触发多次重渲染。
答案 0 :(得分:2)
const [value, updateValue] = useState(translateValueToString(epoch))
translateValueToString
仅使用一次以初始化状态。道具更改不会更新value
,epoch
不会在渲染中使用,也不会更新视图。
useEffect(() => {
updateValue( translateValueToString(epoch) )
}, [epoch])