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

React Native Firebase Firestore文档新增多个map对象字段的实现问题问询

实现方案

直接按照以下步骤修改代码即可实现动态队友输入+符合要求的Firestore数据结构:

1. 调整状态定义

把注释的teammates状态改成数组类型,用来存储所有动态添加的队友信息:

const [teammates, setTeammate] = useState([{ name: '', title: '' }]); // 默认预留1个队友输入位

2. 新增工具函数

分别用来添加新的队友输入项、更新指定队友的输入内容:

// 新增空的队友输入项
const addTeammateInput = () => {
  setTeammates([...teammates, { name: '', title: '' }]);
};

// 更新指定索引的队友字段内容
const handleTeammateChange = (index, field, value) => {
  const updatedTeammates = [...teammates];
  updatedTeammates[index][field] = value;
  setTeammates(updatedTeammates);
};

3. 修改提交数据逻辑

把队友数组转成你需要的Teammate1/Teammate2格式的嵌套map,同时自动过滤无效空数据:

const savePostData = () => {
  // 数组转目标map结构
  const teammatesMap = {};
  teammates.forEach((item, index) => {
    // 跳过姓名、职位都为空的无效队友数据
    if (item.name.trim() || item.title.trim()) {
      teammatesMap[`Teammate${index + 1}`] = {
        name: item.name,
        title: item.title
      };
    }
  });

  firebase.firestore()
  .collection('posts')
  .doc(firebase.auth().currentUser.uid)
  .collection("userPosts")
  .add({
      teammates: teammatesMap,
      age,
      name,
      title,
      createdAt: firebase.firestore.FieldValue.serverTimestamp()
  }).then(() => {
      props.navigation.popToTop()
  })
}

4. 补充UI动态输入渲染

在原有3个输入框下方、提交按钮上方,添加队友输入区域和新增按钮:

{/* 动态队友输入区域 */}
{teammates.map((item, index) => (
  <View key={index} style={{marginTop: 12}}>
    <TextInput 
      placeholder = {`队友${index+1}姓名`}
      value={item.name}
      onChangeText = {(val) => handleTeammateChange(index, 'name', val) }
    />
    <TextInput 
      placeholder = {`队友${index+1}职位`}
      value={item.title}
      onChangeText = {(val) => handleTeammateChange(index, 'title', val) }
    />
  </View>
))}

<Button title="添加新队友" onPress={addTeammateInput} />

修改后完整代码

import React, {useState} from 'react';
import { View, Image, TextInput, Button } from 'react-native';
import firebase from 'firebase';
import { user } from '../redux/reducers/user';
require("firebase/firestore") ;
require("firebase/firebase-storage") ;

export default function Save(props, {navigation}) {
  const [age, setAge] = useState("");
  const [name, setName] = useState("");
  const [title, setTitle] = useState("");
  const [teammates, setTeammates] = useState([{ name: '', title: '' }]);

  // 添加新的空队友输入项
  const addTeammateInput = () => {
    setTeammates([...teammates, { name: '', title: '' }]);
  };

  // 更新指定索引的队友字段内容
  const handleTeammateChange = (index, field, value) => {
    const updatedTeammates = [...teammates];
    updatedTeammates[index][field] = value;
    setTeammates(updatedTeammates);
  };

  const savePostData = () => {
    // 数组转目标map结构
    const teammatesMap = {};
    teammates.forEach((item, index) => {
      // 过滤掉姓名职位都为空的无效队友数据
      if (item.name.trim() || item.title.trim()) {
        teammatesMap[`Teammate${index + 1}`] = {
          name: item.name,
          title: item.title
        };
      }
    });

    firebase.firestore()
    .collection('posts')
    .doc(firebase.auth().currentUser.uid)
    .collection("userPosts")
    .add({
        teammates: teammatesMap,
        age,
        name,
        title,
        createdAt: firebase.firestore.FieldValue.serverTimestamp()
    }).then(() => {
        props.navigation.popToTop()
    })
  }

  return (
    <View style={{flex:1, padding: 16}}>
      <TextInput 
        placeholder = "Age"
        onChangeText = {(age) => setAge(age) }
      />
      <TextInput 
        placeholder = "Name"
        onChangeText = {(name) => setName(name) }
      />
      <TextInput 
        placeholder = "Title"
        onChangeText = {(title) => setTitle(title) }
      />
      
      {/* 动态队友输入区域 */}
      {teammates.map((item, index) => (
        <View key={index} style={{marginTop: 12}}>
          <TextInput 
            placeholder = {`队友${index+1}姓名`}
            value={item.name}
            onChangeText = {(val) => handleTeammateChange(index, 'name', val) }
          />
          <TextInput 
            placeholder = {`队友${index+1}职位`}
            value={item.title}
            onChangeText = {(val) => handleTeammateChange(index, 'title', val) }
          />
        </View>
      ))}

      <Button title="添加新队友" onPress={addTeammateInput} />
      <Button title="Post" onPress = {() => savePostData()} />
    </View>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 09:24:07