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

React传递setAddressForm作为Prop时报错“不是函数”的问题排查

解决"setAddressForm is not a function"错误的原因与修复方案

核心问题

你在父组件Address.js中渲染<AddressCard isAdd={true} />时,没有将setAddressForm作为props传递给子组件。子组件AddressCard尝试调用这个未传递的方法,导致报错"setAddressForm is not a function"。

另外,你通过AddressData.map渲染的所有AddressCard实例也未传递setAddressForm,虽然这些卡片的isAdd为false暂时不会触发点击逻辑,但从组件健壮性角度,建议统一处理。

修复后的代码

1. 父组件 Address.js

//Address.js
import { useState } from 'react';
import AddressCard from './AddressCard';
import AddressData from './AddressData';

export default function Address() {
  const [addressForm, setAddressForm] = useState(false);

  return (
    <div> 
      {!addressForm && (
        <div className="addressCards">
          {/* 必须传递setAddressForm给需要触发状态变更的卡片 */}
          <AddressCard isAdd={true} setAddressForm={setAddressForm} />
          {console.log(addressForm)}

          {AddressData.map((cardProps, index) => {
            // 给动态渲染的卡片也传递setAddressForm(后续若需修改状态可直接使用)
            return (
              <AddressCard key={index} {...cardProps} setAddressForm={setAddressForm} />
            );
          })}
        </div>
      )}
      {/* addressForm为true时显示的表单区域 */}
      {addressForm && <div>地址编辑表单内容</div>}
    </div>
  );
}

2. 子组件 AddressCard.js

添加类型检查增强健壮性,避免未传递方法时出错:

//AddressCard.js
export default function AddressCard({ setAddressForm, isAdd, ...props }) {
  const handleClick = () => {
    // 仅当isAdd为true且setAddressForm是有效函数时执行
    if (isAdd && typeof setAddressForm === 'function') {
      setAddressForm(true);
    }
  }
  return (
    <div className="address-card-container" onClick={handleClick}>
      {props.isDefault ? <div className="isDefault">Default</div> : <div className="isDefault">   </div>}
      <div className="name-and-icons">
        {!isAdd && <div className="name">{props.name}</div>}
        {!isAdd && (
          <div>
            <Edit className="icon"/>
            <DeleteTwoTone className="icon"/>
          </div>
        )}
      </div>
      {!isAdd && <div className="address">{props.address}</div>}
      {!isAdd && <div className="contact">Contact: {props.contact}</div>}
      {!isAdd && (
        <div className="delivery-field">
          <LocationOnIcon className="location-icon"/>
          <a className="delivery">Add Delivery Instructions</a>
        </div>
      )}
      {isAdd && <div>+ Add Address</div>}
    </div>
  );
}

额外优化点

  • 动态渲染列表时,必须给每个AddressCard添加唯一的key属性,符合React的列表渲染规范
  • 子组件中对setAddressForm做类型检查,避免因props缺失导致的运行时错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:24:21