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

React组件通信求助:如何从Modal向Settings.js回传WiFi密码

解决Modal密码回传至Settings组件的方案

核心思路

将Modal中的密码输入通过表单提交事件传递给父组件的回调函数,让Modal负责临时管理输入状态,提交时把密码传递给Settings的处理函数完成后续逻辑。


步骤1:修改Modal组件,处理表单提交并传递密码

更新Modal.js,实现受控输入框并在表单提交时传递密码:

import React, { useState } from 'react';
import { createPortal } from 'react-dom';

const Modal = ({ isShowing, connect, ssid, hide }) => {
  // 用useState管理输入框值,实现受控组件
  const [password, setPassword] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault(); // 阻止表单默认跳转行为
    connect(password); // 将密码传给父组件的处理函数
    hide(); // 提交后关闭Modal
  };

  return isShowing ? createPortal(
    <React.Fragment>
      <div className="modal-overlay" />
      <div className="modal-wrapper" aria-modal aria-hidden tabIndex={-1} role="dialog">
        <div className="modal">
          <div className="modal-header">
            <button type="button" className="modal-close-button" data-dismiss="modal" aria-label="Close" onClick={hide}>
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <div className="modal-body">
            <p>Connect to: {ssid}</p>
            <form onSubmit={handleSubmit}>
              <input
                id="password"
                name="Password"
                type="password"
                value={password}
                onChange={(e) => setPassword(e.target.value)} // 更新输入值
                placeholder="Enter password"
              />
              <button type="submit">Connect</button>
            </form>
          </div>
        </div>
      </div>
    </React.Fragment>, document.getElementById("modal")
  ) : null;
};

export default Modal;

步骤2:简化useModal Hook,移除不必要的密码状态

useModal.js只负责控制Modal的显示/隐藏,无需管理密码:

import { useState } from 'react';

const useModal = () => {
  const [isShowing, setIsShowing] = useState(false);

  function toggle() {
    setIsShowing(!isShowing);
  }

  return {
    isShowing,
    toggle
  };
};

export default useModal;

步骤3:完善Settings组件中的connectWifi函数

启用Settings.js中注释的connectWifi函数,接收密码并处理WiFi连接逻辑:

import React from "react";
import { useState, useEffect } from "react";
import Modal from "../../components/Modal";
import useModal from "../../components/useModal";

const electron = window.require('electron');
const { ipcRenderer } = electron;

const Settings = ({ reqReload }) => {
  const [wifiList, setWifiList] = useState([{ id: "", ssid: 'No Networks available' }]);
  const [ssidSelected, setSsidSelected] = useState("127.0.0.1");
  const { isShowing, toggle } = useModal();

  const updateWifi = (event, args) => {
    setWifiList(args);
  };

  function openDialogue(ssid) {
    setSsidSelected(ssid);
    toggle();
  };

  // 处理密码接收和WiFi连接逻辑
  function connectWifi(password) {
    console.log("Selected SSID: ", ssidSelected);
    console.log("Entered Password: ", password);
    // 这里添加实际连接逻辑,比如通过ipcRenderer发送给主进程
    // ipcRenderer.send('connect-wifi', { ssid: ssidSelected, password });
    toggle();
  }

  useEffect(() => {
    ipcRenderer.send('updateWifi');
    ipcRenderer.on('wifi_list', updateWifi);

    return function cleanup() {
      ipcRenderer.removeListener('wifi_list', updateWifi);
    };
  }, []);

  return (
    <div className="settings">
      <Modal
        isShowing={isShowing}
        connect={connectWifi}
        ssid={ssidSelected}
        hide={toggle}
      />
      <div className="settings__header">
        <h2></h2>
      </div>
      <div className="settings__body">
        <div className="settings__connections">
          <div className="settings__connections__wifi">
            <p><i>Available Wifi-Networks:</i></p>
            <div className="settings__connections__wifi__list">
              {wifiList.map((item, i) => (
                <div className="settings__connections__wifi__list__item" key={i}>
                  <button className="selectNetworkButton" type="button" onClick={() => openDialogue(item.ssid)}>{item.ssid}</button>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </div>
  )
};

export default Settings;

关键说明

  • 受控组件:Modal中的密码输入框通过useState实现受控,确保输入值能被实时捕获。
  • 回调传递:通过connect props将父组件的connectWifi函数传入Modal,提交时将密码作为参数传递。
  • 状态职责分离:useModal仅负责Modal的显示状态,密码由Modal临时管理,最终传递给父组件处理核心业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:30:47