【发布时间】:2021-12-09 21:17:37
【问题描述】:
我有两个组件,其中 selectBirthMonth 取决于 SelectBirthYear。这就是为什么我使用 useEffect 来观察 selectedYear 的变化,以便我可以在需要时更改 selectedMonth。
所以在控制器上下文中,我的组件如下所示
<Controller
control={control}
name="selectedBirthYear"
defaultValue={years[0]}
render={({ field }) => (
<SelectBirthYear
field={field}
years={years}
value={selectedYear}
defaultValue={selectedYear}
onChange={useEffect(() => {setSelectedYear(field.value)})}
/>
)}
/>
</div>
和...
<Controller
control={control}
name="selectedBirthMonth"
defaultValue={months[0]}
render={({ field }) => (
<SelectBirthMonth
field={field}
startYear={startYear}
selectedYear={selectedYear}
months={months}
value={selectedMonth}
defaultValue={selectedMonth}
reducedMonths={reducedMonths}
onChange={useEffect(() => setSelectedMonth(field.value))}
/>
)}
/>
SelectBirthMonth 完全忽略了以下代码:
const [selectedMonth, setSelectedMonth] = useState(months[0]);
const watchYearChange = () => {
if(Number(selectedYear.name) == startYear){
setSelectedMonth(reducedMonths[reducedMonths.length - 1]);
}
};
useEffect(() => watchYearChange(), [selectedYear]);
意思是,无论选择哪一年,月份都不会反应。我错过了什么?
【问题讨论】:
-
您能否更新 CodeSandbox,因为它现在不使用 RHF?至少没有使用
<Controller />。简而言之:有一种更简单的方法可以让您使用 useEffect (您也可以通过将其作为回调传递来错误地使用它),因为您可以在此处使用 RHF 的watch。 -
是的,它在
之前工作,不幸的是 它坏了,这就是为什么我认为提供坏沙盒没有意义。究竟是什么另一种方式,从几天开始,我就被困住了。但是,让我试试看,我是否可以先展示损坏的代码 -
codesandbox.io/s/jolly-brahmagupta-fdfkb - 请查看更改后的沙箱
-
我玩了一会儿,问题是定义,控制器不允许重新渲染值。使用 useEffect 或 watch 正在监视这一年,因为我可以将每个更改记录到控制台。问题在于,setSelectedMonth 不会根据年份触发/不会渲染