You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React表单onSubmit事件失效求助:附AddMovie组件代码

表单onSubmit无法触发的问题排查与修复

核心问题

提交按钮未设置type="submit"。Material-UI的Button组件默认type为button,点击这类按钮不会触发表单的onSubmit事件,必须显式声明type="submit"才能让按钮成为表单提交触发器。

额外问题修复

除核心问题外,代码还有几处小问题需要修正:

  • Director和Actor输入框绑定了错误的onChange函数,导致输入值无法同步到组件state
  • 部分state初始化时带了多余空格,会让输入框初始存在空白内容
  • 提交后直接console.log(movieList)无法获取最新值,因为setMovieList是异步操作,如需查看最新数据,可直接打印构造好的movieObject

修复后的完整代码

const initialValues={
  id:"",
  title:"",
  director:"",
  actor:"",
  genre:""
}
const options = [
{
  label: "Romance",
  value: "romance",
},
{
  label: "Drama",
  value: "drama",
},
{
  label: "Thriller",
  value: "thriller",
},
{
  label: "Crime",
  value: "crime",
},
{
  label: "Comedy",
  value: "comedy",
},
{
  label: "Western",
  value: "western",
},
];
const AddMovie = () => {
const [title,setTitle]=useState("")
const [director,setDirector]=useState("")
const [actor,setActor]=useState("")
const [genre,setGenre]=useState('')
const [movieList,setMovieList]=useState(initialValues);

const handleGenre=(event)=>{
  setGenre(event.target.value)
}

const onTitleChange=(e)=>{
  setTitle(e.target.value)
}

const onDirectorChange=(e)=>{
  setDirector(e.target.value)
}

const onActorChange=(e)=>{
  setActor(e.target.value)
}

const onSubmit=(e)=>{
    e.preventDefault();
    console.log("wete")
    const movieObject={
      title:title,
      director:director,
      actor:actor,
      genre:genre
    }
    setMovieList(movieObject)
    // 直接打印movieObject查看提交数据
    console.log(movieObject)
    axios.post('http://localhost:8000/api/add', movieObject)
          .then((res) => {
              console.log(res.data)
          }).catch((error) => {
              console.log(error)
          });
    setMovieList({ title: '', director: '' ,actor:'',genre:''})
}

return (
   <Box
    component="form"
    sx={{
      '& .MuiTextField-root': { m: 1, width: '25ch' },
    }}
     onSubmit={onSubmit}
    noValidate
    autoComplete="off"
    className="container"
  >
    <div>
    <Typography variant='h3' className="heading">Add Movie</Typography>
      <div className="input-container">
      <TextField
        required
        id="outlined-required"
        label="Movie"
        value={title}
        placeholder="Movie name"
        className="input"
        onChange={onTitleChange}
      />
      
      <TextField
        required
        id="outlined-required"
        label="Director"
        placeholder="Director"
        className="input"
        onChange={onDirectorChange}
      />
      <TextField
        required
        className="input"
        id="outlined-required"
        label="Actor"
        placeholder="Actor"
        onChange={onActorChange}
        
      />
       <div className="input-select">
  <FormControl sx={{ m: 1, width: 300 }}>    
  <InputLabel id="demo-simple-select-label">Genre</InputLabel>
<Select
  labelId="demo-simple-select-label"
  id="demo-simple-select"
  value={genre}
  label="Genre" 
  onChange={handleGenre}
>
{options.map((option,index)=>(
   <MenuItem key={index}value={option.value}>{option.label}</MenuItem>
))}
</Select>
</FormControl>
</div>
        
      </div>
    </div>
    {/* 新增type="submit" */}
    <Button variant="contained" color="primary" type="submit">Add</Button>
    
  </Box>
)
}

export default AddMovie

内容的提问来源于stack exchange,提问作者aysha faisal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:47:20