私はReact-nativeにはかなり新しいので、簡単に私に行ってください! :)React-nativeグローバル変数は定義されていません
私は、アクセス可能であり、複数のコンポーネント間で更新可能である必要がある、そのコアデータに複数の大きなjsonオブジェクトを使用するアプリケーションを作成しています。私はこれを達成しましたが、オブジェクトを配列に強制すると、データがコンポーネント間でしか見えないことがわかりました。すなわち
global.a1['XX']=data.movies; // This works fine
global.a2=data.movies; // This is undefined in other components.
これは機能しますが、なぜアプリケーションを構築する前に何が起こっているのか理解したくありません。
ご協力いただきありがとうございます。
サンプルコードは、以下である:
ファイル:global.js
var a1 = new Object();
var a2 = new Object();
module.exports = { a1, a2 }
ファイル:select.js
'use strict';
import React, { Component,PropTypes } from 'react';
import { Text} from 'react-native';
import * as global from './global';
class Select extends Component {
render() {
console.log("a1:"+global.a1['XX'][0].title); // Ok
console.log("a2:"+global.a2[0].title); // Fails with undefined is not an object
return (<Text>{global.a1['XX'][0].title} {global.a2[0].title}</Text>);
}}
export default Select;
ファイル:
var API_URL = 'http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json';
var PARAMS = '?apikey=7waqfqbprs7pajbz28mqf6vz&page_limit=2';
import React, { Component,PropTypes } from 'react';
import { AppRegistry,Text} from 'react-native';
import * as global from './global';
import Select from './select';
class test extends Component {
constructor(props) {
super(props);
this.state = {loaded: false};
}
componentDidMount() {
fetch(API_URL+PARAMS)
.then((response) => { return response.json() })
.then((responseData) => { return responseData; })
.then((data) => {
global.a1['XX']=data.movies;
global.a2=data.movies;
this.setState({loaded: true});
})
.done();
}
render() {
if (!this.state.loaded) { return (<Text>Loading...</Text>);}
console.log("a1:"+global.a1['XX'][0].title); // This works
console.log("a2:"+global.a2[0].title); // This works
return (<Text><Select/></Text>);
}
}
AppRegistry.registerComponent('test',() => test);
ありがとうございますが、['XX']を追加するとローカルコピーが作成される場合、Selectコンポーネントでデータにアクセスできるのはなぜですか? 2番目の質問は、複数のコンポーネントで更新する必要があるオブジェクトを処理する最善の方法は何ですか? – Railton
これはローカルコピーではなく、オブジェクトへのローカル参照です。オブジェクトに「XX」というプロパティを追加すると、オブジェクトへの参照が保持され、元のオブジェクトが変更されます。 'global.a2'をオーバーライドすると、元のオブジェクトへの参照がローカルに失われるため、ソースに変更が反映されません。 – FMCorz