简体   繁体   English

Firebase数据到React组件

[英]Firebase data to React component

I have a React component that I'm trying to pass some props but I get an Uncaught Error: App.render(): A valid React element (or null) must be returned. 我有一个React组件,我正在尝试传递一些道具,但是出现了一个未捕获的错误:App.render():必须返回一个有效的React元素(或null)。 You may have returned undefined, an array or some other invalid object. 您可能返回了undefined,数组或其他无效对象。 when I try to return it inside the snapshot. 当我尝试将其返回到快照中时。

// cache settings data
fire.settings = {};
fire.settings.ref = fire.database.ref('settings');

// main app build
class App extends Component {
    render() {
      // get values from firebase
      fire.settings.ref.on('value', function(data) {
        return (<Home settings={data.val()} />);
      });
    }
}

So I started messing around with generators and I get the component to render, but I just get an empty object in my settings prop. 因此,我开始搞乱生成器,并获得要渲染的组件,但是在我的设置属性中只是得到了一个空对象。

// main app build
class App extends Component {
    render() {
      // get values from firebase
      function* generator() {
        fire.settings.ref.on('value', function(data) {
          fire.settings.snapshot = data.val();
        });
        yield fire.settings.snapshot;
      }
      // init generator and return homepage
      let promise = generator();
      return (<Home settings={promise.next()} />);
    }
}

As well as using componentDidMount() 以及使用componentDidMount()

// main app build
class App extends Component {
    componentDidMount() {
        this.fire.settings.ref.on('value', function(snapshot) {
            this.props.settings = snapshot.val();
        }, (error) => console.log(error), this);
    }
    render() {
        return (<Home settings={this.props.settings}/>);
    }
}

SOLVED 解决了

Pass the value through the render to the component 通过渲染将值传递给组件

// init render
fire.settings.ref.on('value', function(data) {
  ReactDOM.render(
      <App settings={data.val()}/>, document.getElementById('app'));
});
export default App;

You are trying to return your element inside callback of a listener which is asynchronous. 您正在尝试在异步的侦听器的回调中返回元素。 Instead of that you should set listener inside componentDidMount and call setState inside the callback. 取而代之的是,您应该在componentDidMount内部设置侦听器,并在回调内部调用setState

// cache settings data
fire.settings = {};
fire.settings.ref = fire.database.ref('settings');

// main app build
class App extends Component {

  constructor(props) {
    super(props);
    this.state = { data: null };
    this.onSettingsChanged = this.onSettingsChanged.bind(this);
  }

  onSettingsChanged(data){
    this.setState({data: data.val()});
  }

  componentDidMount() {
    fire.settings.ref.on('value', this.onSettingsChanged);
  }

  render() {
    return (<Home settings={this.state.data}/>);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM