reactjs - 如何在反应中将选择框的值重置为默认值
问题描述
我有以下代码https://codesandbox.io/s/async-http-u9zsg
我想要实现的是每次切换电影时重置第二个选择框的值。
我尝试了很多不同的东西,但没有任何运气。我不是要给我写代码,我只是想朝着正确的方向前进我错过了什么,我的方法完全错误吗?
提前致谢
编码 :
import React, { useState, useEffect } from "react";
import fetch from "node-fetch";
const query = `{
allFilms{
films{
title
characterConnection{
characters{
name
species{
name
}
homeworld{
name
}
}
}
}
}
}`;
function App() {
const [state, setState] = useState({
loading: true,
appliedFilters: {},
species: []
});
useEffect(() => {
const fetchMovieData = () => {
const options = {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query })
};
return fetch(
"https://swapi-graphql.netlify.com/.netlify/functions/index",
options
)
.then(res => res.json())
.then(res =>
setState({ ...state, data: res.data.allFilms.films, loading: false })
);
};
fetchMovieData();
}, []);
if (state.loading) {
return <div>Loading...</div>;
}
/*work from here */
const getSpeciesOptions = () => {
if (state.appliedFilters.movie === undefined) {
return <option>Select a movie first</option>;
}
const currentMovie = state.data.filter(
movie => movie.title === state.appliedFilters.movie
);
const characters = currentMovie[0].characterConnection.characters;
const speciesList = characters.map(char =>
char.species === null ? "unknown" : char.species.name
);
return [...new Set(speciesList)].map(specie => <option>{specie}</option>);
};
const handleFilterChange = e => {
setState({
...state,
appliedFilters: {
...state.appliedFilters,
[e.target.name]: e.target.value
}
});
};
console.log(state);
const removeFilters = () => setState({ ...state, appliedFilters: {} });
const movieOptions = () =>
state.data.map(movie => <option>{movie.title}</option>);
return (
<div className="App">
<form>
<select
name="movie"
onChange={e =>
e.target.value !== "default"
? handleFilterChange(e)
: removeFilters()
}
>
<option value="default">Please select movie</option>
{movieOptions()};
</select>
<select name="species">
<option value="default">Please select a species</option>
{getSpeciesOptions()}
</select>
</form>
</div>
);
}
export default App;
解决方案
您需要做的就是为第二个选择控件创建一个引用。
let ref = React.createRef();
...
<select ref={ref}name="species">
<option value="default">Please select a species</option>
{getSpeciesOptions()}
</select>
</form>
然后在第一个选择的回调中执行以下操作:
const handleFilterChange = e => {
setState(...);
ref.current.value = 'default';
};
使用对元素的引用,您现在可以操纵该值。
推荐阅读
- html - 为什么翻译工作没有过渡:全部?
- python - Python 子流程模块:如何重新打开 PIPE?
- scala - 值 YpartialUnification 不是 scala.tools.nsc.Settings 的成员
- postgresql - sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) fe_sendauth: 未提供密码
- javascript - 如何使用 formset_media_js 处理 inlineformset_factory 内的 JavaScript 事件
- mysql - ebean的Datetime和Mysql数据的时间差
- r - 为什么我无法在散点图中得到平均线?
- python - 大熊猫在 10 年内找到最大日期
- python - 为什么 Python List 的不同初始化会为矩阵乘法提供不同的输出
- r - ggplot2,拼凑而成 - 轴标题的一部分被相邻地块的边缘挡住了