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

React中无法获取props.savedAddress列表索引,需匹配点击事件的key

问题:无法匹配props.savedAddress列表的索引与传入key

无法获取props.savedAddress列表的索引,需要在点击事件中对索引与传入的key进行匹配。

相关处理函数代码

const editAddHandler = (event, key) => {
  const db = getDatabase();
  onValue(ref(db, `users/${userId}/addressData`), (snapshot) => {
    const addresslist = [];
    snapshot.forEach((childSnapshot) => {
      const keyName = childSnapshot.key;
      const data = childSnapshot.val();
      addresslist.push({ key: keyName, data: data });
    });
    props.setSavedAddress(addresslist);
  });

  console.log("array of element",props.savedAddress)

  const clickedAddress = props.savedAddress.findIndex(element => element === key)
  console.log("clicked key",clickedAddress)
      
  const keyValue = props.savedAddress[key];
  console.log("keyvalue",keyValue)
  
  console.log("key",key)

  if(key === props.savedAddress[key]) {
    setValues({
      name: props.savedAddress[key].data.name,
      phone: props.savedAddress.phone,
      pincode: props.savedAddress.pincode,
      address: props.savedAddress.address,
      city: props.savedAddress.city,
      state: props.savedAddress.state,
      landmark: props.savedAddress.landmark,
      defaultAdd: props.savedAddress.defaultAdd,
    })
  }
  props.showAddressHandler();
};

相关截图

控制台输出截图

问题分析与修复

  • 异步数据更新导致的取值问题
    onValue是异步操作,你在调用props.setSavedAddress(addresslist)后立刻读取props.savedAddress,此时新数据还未更新到props,拿到的是旧值。需把后续处理逻辑放在onValue回调内部,确保使用最新的地址列表。

  • findIndex的匹配逻辑错误
    props.savedAddress的元素是对象({ key: keyName, data: data }),用element === key匹配时,对象与字符串永远不相等,导致findIndex返回-1。正确写法是匹配元素的key属性:

const clickedAddressIndex = props.savedAddress.findIndex(element => element.key === key)
  • 数组取值与属性访问错误
    props.savedAddress[key]是按数组索引取值,但key是Firebase节点的字符串key,不是数组索引。应先找到对应元素,再访问其data属性:
const targetAddress = props.savedAddress.find(element => element.key === key)
// 或用上面拿到的索引
const targetAddress = props.savedAddress[clickedAddressIndex]
  • setValues时的属性访问错误
    赋值时错误直接访问props.savedAddress.phone这类属性,需从目标元素的data对象中取值:
setValues({
  name: targetAddress.data.name,
  phone: targetAddress.data.phone,
  pincode: targetAddress.data.pincode,
  address: targetAddress.data.address,
  city: targetAddress.data.city,
  state: targetAddress.data.state,
  landmark: targetAddress.data.landmark,
  defaultAdd: targetAddress.data.defaultAdd,
})

修复后的完整代码

const editAddHandler = (event, key) => {
  const db = getDatabase();
  onValue(ref(db, `users/${userId}/addressData`), (snapshot) => {
    const addresslist = [];
    snapshot.forEach((childSnapshot) => {
      const keyName = childSnapshot.key;
      const data = childSnapshot.val();
      addresslist.push({ key: keyName, data: data });
    });
    props.setSavedAddress(addresslist);

    // 所有逻辑移至回调内,确保使用最新数据
    console.log("array of element", addresslist);

    const clickedAddressIndex = addresslist.findIndex(element => element.key === key);
    console.log("clicked index", clickedAddressIndex);

    const targetAddress = addresslist.find(element => element.key === key);
    console.log("target address", targetAddress);

    console.log("key", key);

    if (targetAddress) { // 确保找到目标地址再赋值
      setValues({
        name: targetAddress.data.name,
        phone: targetAddress.data.phone,
        pincode: targetAddress.data.pincode,
        address: targetAddress.data.address,
        city: targetAddress.data.city,
        state: targetAddress.data.state,
        landmark: targetAddress.data.landmark,
        defaultAdd: targetAddress.data.defaultAdd,
      });
    }
    props.showAddressHandler();
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:25:05