首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React通过触发另一个组件中的事件来呈现组件

React通过触发另一个组件中的事件来呈现组件
EN

Stack Overflow用户
提问于 2020-06-25 20:37:14
回答 1查看 183关注 0票数 0

父组件连接到Google,并使用setCards挂钩将所有数据保存到卡片中。

接下来,我们将两个子组件导入到父组件中:

代码语言:javascript
复制
<UpdateCard card={card} />
<AddCard totalDoclNumbers={totalDoclNumbers} />

父组件- DockList

代码语言:javascript
复制
import React, { useState, useEffect } from 'react';
import { db } from '../firebase';
import UpdateCard from './UpdateCard';
import AddCard from './AddCard';

const DocList = () => {
  const [cards, setCards] = useState([]);
  const [beginAfter, setBeginAfter] = useState(0);
  const [totalDoclNumbers, setTotalDoclNumbers] = useState(0);
    
  useEffect(() => {
    const fetchData = async () => {
      const data = await db
        .collection('FlashCards')
        .orderBy('customId')
        .startAfter(beginAfter)
        .get();
      setCards(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
    };
    fetchData();
  }, [beginAfter]);

 
  return (
      <ul className='list'>
        {cards.map((card) => (
          <li key={card.id} className='list__item' data-id={card.id}>
            <UpdateCard card={card} />
          </li>
        ))}
        <AddCard totalDoclNumbers={totalDoclNumbers} />
      </ul>
  );
};

export default DocList;

在UpdateCard中,我们使用无序列表列出卡中存储的所有数据:

代码语言:javascript
复制
import React, { useState } from 'react';
import { db } from '../firebase';

const UpdateCard = ({ card }) => {
  const [translatedText, setTranslatedText] = useState(card.translatedText);
  const [customId, setCustomId] = useState(card.customId);

  const onUpdate = async () => {
    await db
      .collection('FlashCards')
      .doc(card.id)
      .update({ ...card, customId, originalText, translatedText, imgURL });    
  };

  return (
    <>
      <input
        type='text'
        value={customId}
        onChange={(e) => {
          setCustomId(Number(e.target.value));
        }}
      />
      <textarea
        value={translatedText}
        onChange={(e) => {
          setTranslatedText(e.target.value);
        }}
      />
      <button onClick={onUpdate}>
        Update
      </button>
    </>
  );
};

export default UpdateCard;

最后,在名为AddCard的第二个子组件中,我们有一个按钮,它触发函数onAdd将新数据添加到FireStore集合中。

代码语言:javascript
复制
import React, { useState } from 'react';
import { db } from '../firebase';

const AddCard = ({ totalDoclNumbers }) => {
  const [newTranslatedText, setNewTranslatedText] = useState([]);
  const nextNumber = totalDoclNumbers + 1;

  const onAdd = async () => {
    await db.collection('FlashCards').add({
      translatedText: newTranslatedText,
      customId: Number(nextNumber),
    });   
  };

  return (
    <ul className='list'>
      <li key={nextNumber}>
        <input
          type='text'
          className='list__input'
          defaultValue={nextNumber}
        />
        <textarea
          onChange={(e) => setNewTranslatedText(e.target.value)}
        />
        <button onClick={onAdd}>
          Add
        </button>
      </li>
    </ul>
  );
};

export default AddCard;

一切都很好。单击第二个子组件AddCard组件内的按钮时,新数据将存储到集合中。

但是,为了能够看到新添加的数据,我需要呈现UpdateCard,这正是我正在努力解决的问题。

如何实现在AddCard组件中单击按钮,在UpdateCard组件中触发呈现。

EN

回答 1

Stack Overflow用户

发布于 2020-06-25 20:54:57

好的,首先在DocList上添加一个回调函数:

代码语言:javascript
复制
const DocList = () => {
  ...
  const [addButtonClickCount, setAddButtonClickCount] = useState(0);
  ...
  return (
      <ul className='list'>
        {cards.map((card) => (
          <li key={card.id} className='list__item' data-id={card.id}>
            <UpdateCard card={card} addButtonClickCount={addButtonClickCount}/>
          </li>
        ))}
        <AddCard totalDoclNumbers={totalDoclNumbers} onAddButtonClick={(card) => {
           setAddButtonClickCount(c => c + 1)
           setCards(cards => [...cards, {...card.data(), id: card.idcard}])
        }} />
      </ul>
  );
};

然后调用onAddButtonClick,在需要时将其作为道具传递给AddCard

代码语言:javascript
复制
const AddCard = ({ totalDoclNumbers, onAddButtonClick }) => {
...
const onAdd = async () => {
    // Somehow you gotta get value of newly created card:
    let card = await db.collection('FlashCards').add({
      translatedText: newTranslatedText,
      customId: Number(nextNumber),
    }); 
    
    // pass the newly created card here so you could use it in `UpdateCard`
    onAddButtonClick(card) // this looks likes where it belongs.
  };

这将导致UpdateCard组件的重命名,因为它将addButtonClickCount作为支持,如果您想在单击add按钮之后在UpdateCard中执行某些操作,则可以在[addButtonClickCount]依赖数组中使用useEffect

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62583931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档