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

React中如何获取下拉选框值并随邮件发送?

解决React-Select选中项无法通过EmailJS发送的问题

问题核心:react-select是自定义UI组件,不属于原生表单元素,EmailJS的sendForm方法只能自动收集原生input/textarea/select的值,所以直接给Select加name属性无法被捕获。以下是两种可行的解决方法:

方案一:用隐藏Input同步选中值

通过添加隐藏的原生input,将react-select的选中值同步到这个input中,让sendForm能自动收集该字段。

修改后的代码:

import React, { useRef, useState } from 'react';
import emailjs from '@emailjs/browser';
import Data from './data.json'
import Select from 'react-select'

export const Email = () => {
  const form = useRef();
  const [selectedOption, setSelectedOption] = useState(null);

  const sendEmail = (e) => {
    e.preventDefault();

    emailjs.sendForm('xxxxx', 'xxxxxx', form.current, 'xxxxxx')
      .then((result) => {
          console.log(result.text);
      }, (error) => {
          console.log(error.text);
      });
  };

  return (
    <form ref={form} onSubmit={sendEmail} className="flex flex-col mx-7 md:w-[30%] md:mx-auto">
      <label className="font-semibold">Name</label>
      <input type="text" name="user_name" className="rounded-md border-2 border-purple-500"/>
      <label className="font-semibold">Email</label>
      <input type="email" name="user_email" className="rounded-md border-2 border-purple-500"/>
      <label className="font-semibold">Message</label>
      <textarea name="message" className='rounded-md border-2 border-purple-500'/>
      <label className="font-semibold">Select Item</label>
      <Select 
        options={Data} 
        value={selectedOption}
        onChange={(option) => setSelectedOption(option)}
        getOptionLabel={(option) => option.title}
        getOptionValue={(option) => option.title}
      />
      {/* 隐藏input,用于EmailJS收集选中值 */}
      <input 
        type="hidden" 
        name="selected_item" 
        value={selectedOption ? selectedOption.title : ''} 
      />
      <input type="submit" value="Send" className="font-semibold w-16 mx-auto mt-7 rounded-md bg-purple-300 hover:cursor-pointer hover:border-purple-800 hover:bg-purple-500 border-2 border-purple-500"/>
    </form>
  );
};

注意:需要在EmailJS的邮件模板中添加{{selected_item}}变量,才能在邮件中显示选中的内容。

方案二:手动构造表单数据,使用EmailJS.send方法

放弃sendForm,手动收集所有表单字段(包括react-select的选中值),用emailjs.send方法发送数据,灵活性更高。

修改后的代码:

import React, { useRef, useState } from 'react';
import emailjs from '@emailjs/browser';
import Data from './data.json'
import Select from 'react-select'

export const Email = () => {
  const form = useRef();
  const [selectedOption, setSelectedOption] = useState(null);

  const sendEmail = (e) => {
    e.preventDefault();

    // 手动收集所有表单数据
    const formData = {
      user_name: form.current.user_name.value,
      user_email: form.current.user_email.value,
      message: form.current.message.value,
      selected_item: selectedOption ? selectedOption.title : ''
    };

    emailjs.send('xxxxx', 'xxxxxx', formData, 'xxxxxx')
      .then((result) => {
          console.log(result.text);
      }, (error) => {
          console.log(error.text);
      });
  };

  return (
    <form ref={form} onSubmit={sendEmail} className="flex flex-col mx-7 md:w-[30%] md:mx-auto">
      <label className="font-semibold">Name</label>
      <input type="text" name="user_name" className="rounded-md border-2 border-purple-500"/>
      <label className="font-semibold">Email</label>
      <input type="email" name="user_email" className="rounded-md border-2 border-purple-500"/>
      <label className="font-semibold">Message</label>
      <textarea name="message" className='rounded-md border-2 border-purple-500'/>
      <label className="font-semibold">Select Item</label>
      <Select 
        options={Data} 
        value={selectedOption}
        onChange={(option) => setSelectedOption(option)}
        getOptionLabel={(option) => option.title}
        getOptionValue={(option) => option.title}
      />
      <input type="submit" value="Send" className="font-semibold w-16 mx-auto mt-7 rounded-md bg-purple-300 hover:cursor-pointer hover:border-purple-800 hover:bg-purple-500 border-2 border-purple-500"/>
    </form>
  );
};

同样,需在EmailJS模板中添加{{selected_item}}来展示选中项。

额外说明:你的data.json中选项用title作为显示文本,react-select默认识别label和value字段,所以必须通过getOptionLabel和getOptionValue手动指定字段,否则下拉选项会显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:05:41