getElementById + .appendhild () [Błąd typu: Nie można wykonać 'appendChild' on 'węzeł': Parametr 1 jest typu 'Węzły'].

głosy
0

Mam niestandardowego połączenia komponentu „artykuł”, a ja staram się pokazać swoje artykuły, w którym jest sotck w moim db z mojego składnika art.

function renderArticle(doc){
    var article = '<Article name=' + doc.data().name + ' content=' + doc.data().content + ' id=' + doc.data().id + '/>'
    document.getElementById('articles-list').appendChild(article)

}
 
const db = firebase.firestore()
db.collection('articles').get().then((snapshot) => {
    snapshot.docs.forEach(doc => {
      renderArticle(doc)
    })
  })

Kiedy go uruchomić, konsola powrót mi TypeError: nie można wykonać „appendChild” on „węzła”: parametr 1 nie jest typu „Node”.

Jestem blok ...

Utwórz 13/02/2020 o 22:04
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Użyj Element.insertAdjecentHTML, aby wstawić ciąg jako HTML. Pierwszym parametrem jest pozycja gdzie dodać HTML. Drugim parametrem jest HTML do wstawienia.

function renderArticle(doc){
    var article = '<Article name="' + doc.data().name + '" content="' + doc.data().content + '" id="' + doc.data().id + '"/>';
    document.getElementById('articles-list').insertAdjacentHTML('beforeend', article);
}

Ale skoro używasz React należy zrobić to inaczej. Z tego co znalazłem należy użyć ReactDOM.renderfunkcji do renderowania komponentu w locie i włóż ją do DOM.

function renderArticle(doc){
  var article = '<Article name="' + doc.data().name + '" content="' + doc.data().content + '" id="' + doc.data().id + '"/>';
  ReactDOM.render(article, document.getElementById('articles-list'));
}

Upewnij się, aby zaimportować ReactDOMmoduł go używać prawidłowo. Umieścić importu w górnej części skryptu.

import ReactDOM from 'react-dom'
Odpowiedział 13/02/2020 o 22:15
źródło użytkownik

głosy
1

AS @Calvin Nunes że trzeba przekazać węzła na document.createElement (), ale jak to określili reactjs może można użyć kilka porad o tym zbyt.

W React drogę mamy do renderowania danych, które przychodzi asynchronicznie (np docs że otrzymujesz od DB) jest śledzenie ich do stanu komponentów.

W pierwszej chwili świadczymy null lub jakiś wskaźnik ładowania i ogień wniosek, aby uzyskać nasze dane. Gdy dane są ładowane stawiamy naszego państwa i dzięki temu nasz komponent będzie rerender możemy uczynić to, co jest w stanie.

Jeśli korzystasz z cyklu życia komponentu kod byłoby jak:

import React, {Component} from 'react';

class ArticleList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      docs: null,
    };
  }

  componentDidMount() {
    db.collection('articles').get().then((snapshot) => {
      this.setState({docs: snapshot.docs});
    })
  }

  render() {
    if (docs === null) return null;
    return (
      <div>
        {docs.map((doc) => {
          return (
            <Article
              content={doc.data().content}
              key={doc.data().id}
              id={doc.data().id}
              name={doc.data().name}
            />
          );
        })}
      </div>
    );
  }
}

export default ArticleList;

Jeśli używasz funkcji z hakami kod byłoby jak:

import React, {useEffect, useState} from 'react';
import Article from './Article'; // your other component

function ArticleList () {
  const [docs, setDocs] = useState(null);
  const db = firebase.firestore();
  useEffect(() => {
    db.collection('articles').get().then((snapshot) => {
      setDocs(snapshot.docs);
    })
  }, [db, setDocs]);
  if (docs === null) return null;
  return (
    <div>
      {docs.map((doc) => {
        return (
          <Article
            content={doc.data().content}
            key={doc.data().id}
            id={doc.data().id}
            name={doc.data().name}
          />
        );
      })}
    </div>
  );
}

export default ArticleList;

Prawdopodobnie będziesz musiał memoize obiekt db zbyt w celu uruchomienia haków useEffect tylko raz, ale to nie o to chodzi tutaj.

Odpowiedział 13/02/2020 o 22:34
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more