Search code examples
cssreactjsdomaddeventlistenerappendchild

What do I need to do that appendChild and addEventListener is going to work?


I can see the issue here. Stuff is going to fetch before it's still there in the order of code execution, but I don't know how to fix that at all.

I want to grab some infos from my firebase firestore database and put it in the dom in a way I can show it of nicely.

The other thing is, css file isn't working cause of the same issue. When I setAttribute to it it's already initialized and of course, it wouldn't show up at all (for example: border: 50% to make the pic round).

What do I miss to learn?

import React from "react";
import firebase from "./firebase";
import "./artists-styles.css";

const db = firebase.firestore();

const form = document.querySelector("#add-artist-avatar");

function renderArtists(doc) {
      
  const artistsAvatar = document.querySelector(".content");

  let image = document.createElement("img");

  image.setAttribute("src", doc.data().avatar);

  artistsAvatar.appendChild(image);
}

// getting data

db.collection("artists")
  .get()
  .then(snapshot => {
    console.log(snapshot.docs);
    snapshot.docs.forEach(doc => {
      console.log(doc.data());
      renderArtists(doc);
    });
  });

// saving data

form.addEventListener("submit", e => {
  e.preventDefault();
  db.collection("artists").add({
    avatar: form.avatar.value,
  });
  form.name.value = "";
});

const Artists = () => {
  return (
    <div>
      <h1>Cloud Cafe</h1>
      <form id="add-artist-avatar">
        <input type="text" name="avatar" placeholder="Artists Avatar Link" />
        <button>Add Avatar</button>
      </form>
      <div className="content"></div>
    </div>
  );
};

export default Artists;

Solution

  • Perhaps you need something like this

    import React, { useEffect, useState } from "react";
    import firebase from "./firebase";
    import "./artists-styles.css";
    
    const db = firebase.firestore();
    
    const Artists = () => {
      const [docs, setDocs] = useState([]);
      const [inputValue, setInputValue] = useState('');
      
      useEffect(() => {
        db.collection("artists")
          .get()
          .then(snapshot => {
            console.log(snapshot.docs);
            setDocs(snapshot.docs);
          });
      }, []);
      
      const handleSubmit = e => {
        e.preventDefault();
        db.collection("artists").add({
          avatar: inputValue
        });
      };
      
      
      return (
        <div>
          <h1>Cloud Cafe</h1>
          <form id="add-artist-avatar" onSubmit={(e) => handleSubmit(e)}>
            <input
                type="text"
                name="avatar"
                placeholder="Artists Avatar Link"
                value={inputValue}
                onChange={e => setInputValue(e.target.value)}
            />
            <button>Add Avatar</button>
          </form>
          <div className="content">
            {docs.map(doc => (
              <img src={doc.data().avatar}/>
            ))}
          </div>
        </div>
      );
    };
    
    export default Artists;