【问题标题】:Firebase data to React componentFirebase 数据到 React 组件
【发布时间】:2017-03-19 04:07:34
【问题描述】:

我有一个 React 组件,我试图传递一些道具,但我得到一个 Uncaught Error: App.render(): A valid React element (or null) must be returned。您可能返回了未定义、数组或其他一些无效对象。当我尝试在快照中返回它时。

// 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()} />);
      });
    }
}

所以我开始搞乱生成器并让组件渲染,但我的设置道具中只得到一个空对象。

// 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()} />);
    }
}

以及使用 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}/>);
    }
}

已解决

将值通过渲染传递给组件

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

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database


    【解决方案1】:

    您试图在异步侦听器的回调中返回您的元素。取而代之的是,您应该在 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}/>);
      }
    }
    

    【讨论】:

    • 我收到几个错误 - 1. 警告:getInitialState 是在 App 上定义的,一个普通的 JavaScript 类。这仅支持使用 React.createClass 创建的类。你的意思是定义一个状态属性吗? 2. Uncaught TypeError: Cannot read property 'data' of null
    • getInitialState() 用于 ES5(使用 React.createClass())。对于 ES6 类,您只需在构造函数中设置状态。 constructor(props) { super(props); this.state = { data: null }; } 此外,对于 ES6+,您可以在类内部使用属性初始化器来设置状态:state = { data: null }
    • 糟糕!我搞砸了 ES5 和 ES6 语法。修复它并更新了答案!
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2021-09-20
    • 2020-01-22
    相关资源
    最近更新 更多