在 React-native 中切换页面还有 return 信息
Switching between pages in React-native also return information
我无法将值发送到另一个页面。 locID、tourInfo、userName、userEmail 我想发送这个值。但是我是react-native的新手,我不知道。
我想post在不同的组件中获取信息。
Mapview.js (locID, tourInfo,) => ShowInfo.js
如果你研究代码,你可以帮助我。其实我要做一些很简单的事情,但是我不知道该做什么。
我需要将变量(locID 和 tourInfo)发送到 ShowInfo.js 页面。在地图上打开我的位置。
Mapview.js
import React from 'react';
import {getDistance, getPreciseDistance} from 'geolib'; // Mesafe Fark hesaplama kütüphanesi
import MapView, {Marker, PROVIDER_GOOGLE, Callout} from 'react-native-maps'; // Harita kullanım Kütüphansi
import Geolocation from '@react-native-community/geolocation'; // Anroide konum zaman aşımına uğramasını engellemek için kullanılır
import {Actions} from 'react-native-router-flux'; // yan menü açma ve sayfalar arasında geçiş de kullanılır (cihazın geri tuşu triği var)
import {
StyleSheet, // Stil Sayfası
Image,
View,
Dimensions, // Ekran Pencere Boyurları anlık çeker App dizaynı ona göre yapar
TouchableOpacity,
Text,
} from 'react-native';
const {width, height} = Dimensions.get('window');
import LinearGradient from 'react-native-linear-gradient'; // Düz doğrular yada levhalar yapmak için kullanılır
import MapViewDirections from 'react-native-maps-directions'; // İki mesafe arasında rota oluşturan kod
import ImagePicker from 'react-native-image-picker'; // Kamera kulanma ve cihazdan app resim video yükleme kütüphanesi
import * as firebase from 'firebase'; // firebase kütüphanesi importedildi
let locationRef = db.ref('/Location');
import {db} from '../../components/dbConfig/config';
import {requestAuthorization} from 'react-native-geolocation-service';
if (!firebase.apps.length) {
firebase.initializeApp(db);
}
const rootRef = firebase.database().ref();
export default class Mapview extends React.Component {
constructor(props) {
super(props);
this.state = {
latitude: 0,
longitude: 0,
error: null,
coords: [],
places: null,
selectedLat: '',
selectedLang: '',
distance: '',
};
}
getLocation = () => {
Geolocation.getCurrentPosition(position => {
this.setState({latitude: position.coords.latitude});
this.setState({longitude: position.coords.longitude});
});
};
setLatLang = (lat, lng) => {
this.setState({selectedLat: lat});
this.setState({selectedLang: lng});
};
showCoords() {
const arrayMarkers = [];
var coordsLatLang = [];
var allCoords = [];
var selectedCoordLat = [];
var selectedCoordLang = [];
var dis = [];
Geolocation.getCurrentPosition(position => {
var userLat = position.coords.latitude;
var userLang = position.coords.longitude;
for (let index = 0; index < this.props.locCoord.length; index++) {
coordsLatLang = this.props.locCoord[index].split(',');
allCoords.push(this.props.locCoord[index].split(','));
selectedCoordLat.push(allCoords[index][0]);
selectedCoordLang.push(allCoords[index][1]);
dis.push(
getDistance(
// Mesafe Hesaplama fonciyonu 2 boyutlu
{latitude: userLat, longitude: userLang},
{
latitude: selectedCoordLat[index],
longitude: selectedCoordLang[index],
},
),
);
var lat = coordsLatLang[0];
var lng = coordsLatLang[1];
arrayMarkers.push(
<Marker
pinColor={'#24012f'}
coordinate={{
latitude: Number(lat),
longitude: Number(lng),
}}>
<Callout
tooltip
style={{position: 'relative'}}
onPress={() => {
this.setLatLang(
selectedCoordLat[index],
selectedCoordLang[index],
);
**if ((dis[index] / 1000).toFixed(2) < 0.5) { ----------------------------
Actions.ShowInfo({
locationID: this.props.locationID,
userName: this.props.userName,
rating: this.props.rating,
locID: this.props.locID,
});
}**----------------------------------------------------------
}}>
<LinearGradient
start={{x: 0, y: 0}}
end={{x: 1, y: 0}}
style={{borderRadius: 20}}
colors={['#531c5c', '#4b5cab']}>
<View
style={{
flexDirection: 'column',
alignContent: 'center',
alignItems: 'center',
flex: 1,
padding: 15,
}}>
<Text
style={{color: 'white', fontWeight: 'bold', fontSize: 20}}>
{this.props.locNames[index]}
</Text>
<Text style={{marginTop: 5, color: 'white'}}>
Puanı:{this.props.TourLocRating[index].toFixed(2)}
</Text>
<Text style={{color: 'white'}}>
Mesafe:{(dis[index] / 1000).toFixed(2)}KM
</Text>
<Text style={{marginTop: 5, color: 'white', marginBottom: 5}}>
Rota Oluşturmak İçin Tıklayın!
</Text>
</View>
</LinearGradient>
</Callout>
</Marker>,
);
}
});
this.setState({places: arrayMarkers});
}
openCam() {
// kamera Başalama kodu
ImagePicker.launchCamera(response => {
// Kamerayı başlatır
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.error) {
console.log('ImagePicker Error: ', response.error);
} else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
} else {
const source = {uri: response.uri};
// You can also display the image using data: // Verileri kullanarak da görüntüyü görüntüleyebilirsiniz:
// const source = { uri: 'data:image/jpeg;base64,' + response.data };
this.setState({
avatarSource: source,
});
}
});
}
componentWillMount() {
this.showCoords();
}
componentDidMount() {
this.getLocation();
}
render() {
console.log(this.props.images);
return (
<View style={{flex: 1}}>
<View
style={{
backgroundColor: 'white',
alignItems: 'center',
width: width,
height: height * 0.08,
fontWeight: 'bold',
flexDirection: 'row',
justifyContent: 'flex-start',
}}>
<TouchableOpacity
onPress={() => {
this.props.navigation.goBack();
}}>
<Image
style={{
width: width * 0.05,
height: height * 0.03,
marginTop: 15,
marginBottom: 10,
marginLeft: 5,
}}
source={require('../../img/back.png')}
/>
</TouchableOpacity>
<Image
resizeMode="contain"
style={{marginLeft: width * 0.17}}
source={require('../../img/headerText.png')}
/>
</View>
<View style={[styles.lineFooterStyle]} />
<MapView
provider={PROVIDER_GOOGLE}
region={{
latitude: this.state.latitude,
longitude: this.state.longitude,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
}}
showsUserLocation={true}
style={{flex: 1}}>
{this.state.places}
<MapViewDirections // Rota Oluşturmak
precision={'high'}
origin={{
latitude: this.state.latitude,
longitude: this.state.longitude,
}} // Mevcut Konum
destination={{
latitude: this.state.selectedLat,
longitude: this.state.selectedLang,
}} // Hedef Konum
apikey={'AIzaSyAYGO8DoGtW-v8lEdDbtagGNp5ogtAA8ok'}
strokeWidth={6}
strokeColor="#531959"
/>
</MapView>
<View>
<TouchableOpacity
style={{
width: width * 0.2,
height: width * 0.2,
marginTop: -height * 0.17,
marginLeft: width * 0.4,
}}
onPress={() => this.openCam()}>
<Image
style={{
width: width * 0.2,
height: width * 0.2,
marginTop: 15,
borderRadius: 25,
}}
source={require('../../img/ARLogo.png')}
/>
</TouchableOpacity>
</View>
<View style={styles.lineFooterStyle} />
<View style={styles.footerStyle}>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Mainpage')}>
<Image
style={styles.navItemHomeStyle}
source={require('../../img/Home.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Discover')}>
<Image
style={styles.navItemBookmarkStyle}
source={require('../../img/Bookmark_2.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('MyProfile')}>
<Image
style={styles.navItemProfileStyle}
source={require('../../img/Profile.png')}
/>
</TouchableOpacity>
</View>
</View>
);
}
}
ShowInfo.js
import React from 'react';
import {Actions} from 'react-native-router-flux';
import {
StyleSheet,
Text,
ScrollView,
Image,
View,
Dimensions,
TouchableOpacity,
TextInput,
} from 'react-native';
import {AirbnbRating, Rating} from 'react-native-ratings'; // puanlama kütüphanesi Yıldız verme
import LinearGradient from 'react-native-linear-gradient'; // düz lehva cigi oluşurmak
import * as firebase from 'firebase'; // firebase kütüphanesi importedildi
import {SliderBox} from 'react-native-image-slider-box'; // resim gösterme slider yapama kütüphanesi
const {width, height} = Dimensions.get('window'); // Ekran
import Comment from '../HorizontalSlider/Comment'; // yatay kaydıma yapabilmek için kullanılır.
let userRef = db.ref('/Users');
let commentsRef = db.ref('/LocationComments');
let locationRef = db.ref('/Location');
import {db} from '../../components/dbConfig/config';
if (!firebase.apps.length) {
firebase.initializeApp(db);
}
const rootRef = firebase.database().ref();
const loccommentRef = rootRef.child('LocationComments');
let addItem = (comment, locationID, userName, rating, comments, locID) => {
// kullanıcı konuma yorum yapma işlemi
loccommentRef.push({
comment: comment,
LocationID: locationID,
username: userName,
users: [],
rating: rating,
});
var count = 0;
var newRating = 0;
for (let index = 0; index < comments.length; index++) {
if (locID == comments[index].LocationID) {
count++;
newRating += comments[index].rating;
}
}
var generalNewRating = (newRating + rating - 1) / count;
locationRef.child(locID).update({Rating: generalNewRating});
};
export default class ShowInfo extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
locInfo: [],
comments: [],
comment: '',
userName: '',
userEmail: '',
rating: '',
users: [],
};
}
ratingCompleted = rating => {
this.setState({rating: rating});
};
getUserData() {
userRef.on('value', snapshot => {
let data = snapshot.val();
let users = Object.values(data);
this.setState({users: users});
});
}
getComments() {
commentsRef.on('value', snapshot => {
let data = snapshot.val();
let comments = Object.values(data);
this.setState({comments: comments});
});
}
getLocationData() {
locationRef.on('value', snapshot => {
let data = snapshot.val();
let locInfo = Object.values(data);
this.setState({locInfo: locInfo});
});
}
getUserName = () => {
for (let index = 0; index < this.state.users.length; index++) {
if (this.props.userEmail == this.state.users[index].email) {
return this.state.users[index].username;
}
}
};
updateRating = () => {
var count = 0;
for (let index = 0; index < this.state.comments.length; index++) {
if (this.props.locID == this.state.comments[index].LocationID) {
count++;
}
}
locationRef.child(this.props.locID).update({
Rating:
(this.state.locInfo[this.props.locID].Rating + this.state.rating) /
count,
});
};
componentWillMount() {
this.getLocationData();
this.getUserData();
this.getComments();
}
inRender(images, commentContext, comments, locCoord, locNames) {
console.log(this.state.locInfo[2].Rating, '------');
if (this.getUserName() != null) {
this.setState({userName: this.getUserName()});
}
for (let index = 0; index < this.state.locInfo.length; index++) {
if (this.props.locID == this.state.locInfo[index].ID) {
images = this.state.locInfo[index].Image.split(',');
console.log(
' :LocID değeri********* ',
this.state.locInfo[index],
' --00ss- ',
index,
);
locCoord.push(this.state.locInfo[index].Coordinate);
console.log(locCoord);
locNames.push(this.state.locInfo[index].Name);
}
}
for (let index = 0; index < this.state.comments.length; index++) {
if (this.props.locID == this.state.comments[index].LocationID) {
comments.push(this.state.comments[index]);
}
}
for (let index = 0; index < comments.length; index++) {
if (comments[index].username != '') {
commentContext.push(
<Comment
username={comments[index].username}
comment={comments[index].comment}
rating={comments[index].rating}
/>,
);
}
}
return images;
}
render() {
var locNames = [];
var images = [];
var comments = [];
var commentContext = [];
var locCoord = [];
var retImages = this.inRender(
images,
commentContext,
comments,
locCoord,
locNames,
);
var TourLocRating = [];
TourLocRating.push(this.props.rating);
return (
<View style={{flex: 1, backgroundColor: 'white'}}>
<View
style={{
backgroundColor: 'white',
alignItems: 'center',
width: width,
height: height * 0.08,
fontWeight: 'bold',
flexDirection: 'row',
justifyContent: 'flex-start',
}}>
<TouchableOpacity
onPress={() => {
this.props.navigation.goBack();
}}>
<Image
style={{
width: width * 0.05,
height: height * 0.03,
marginTop: 15,
marginBottom: 10,
marginLeft: 5,
}}
source={require('../../img/back.png')}
/>
</TouchableOpacity>
<Image
resizeMode="contain"
style={{marginLeft: width * 0.17}}
source={require('../../img/headerText.png')}
/>
</View>
<View style={[styles.lineFooterStyle]} />
<ScrollView>
<SliderBox
style={{height: height * 0.4, marginLeft: 5, marginRight: 5}}
imageLoadingColor="white"
dotColor="white"
inactiveDotColor="#90A4AE"
autoplay
disableOnPress
circleLoop
images={retImages}
// Dizi olarak tutulur resimin ya yolu yada linki bulunur
//currentImageEmitter={index => locName = imgSliderHolder[index].Name } //Resim üzerinde lokasyonun adını gösterebilirsin. Resim geldiğinde gerçekleşen func.
//onCurrentImagePressed={index => Actions.ShowInfo({ locImage: images[index], tourName: imgSliderHolder[index].Name, info: imgSliderHolder[index].Info })}
/>
<View style={{marginLeft: 15}}>
<View style={{flexDirection: 'row'}}>
<View style={{flexDirection: 'column'}}>
<View style={{marginTop: 30}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginLeft: height * 0.01,
}}>
{this.props.tourName}
</Text>
<LinearGradient
style={styles.gradientLineStyle}
start={{x: 0, y: 1}}
end={{x: 1, y: 1}}
colors={['#3E276F', '#F9F7F6']}
/>
</View>
<TouchableOpacity
style={styles.BtnStyleLogin}
onPress={() =>
Actions.LocMapview({
locCoord: locCoord,
locNames,
kind: 'location',
TourLocRating,
})
}>
<Text style={{color: 'white'}}>Başla</Text>
</TouchableOpacity>
<View style={{flexDirection: 'row'}}>
<Rating
readonly={true}
startingValue={this.props.rating}
style={{paddingVertical: 10}}
imageSize={20}
/>
<Text
style={{
marginLeft: width * 0.02,
marginBottom: height * 0.015,
marginTop: height * 0.012,
fontWeight: 'bold',
}}>
Puanı:
</Text>
</View>
</View>
<TouchableOpacity onPress={() => this.playSound()}>
<Image
style={{width: 40, height: 40, marginTop: height * 0.1}}
source={require('../../img/sound_button.png')}
/>
</TouchableOpacity>
</View>
<View
style={{
flexDirection: 'row',
marginBottom: 15,
marginTop: 15,
justifyContent: 'space-between',
}}>
<TouchableOpacity
onPress={() => {
this.refs._scrollView.scrollTo();
}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginLeft: height * 0.025,
}}>
Hakkında
</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={() => {
this.refs._scrollView.scrollTo({x: width, y: 0});
}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginRight: 15,
}}>
Değerlendir
</Text>
</TouchableOpacity>
</View>
<LinearGradient
style={styles.gradientLineStyle}
start={{x: 0, y: 1}}
end={{x: 1, y: 1}}
colors={['#3E276F', '#F9F7F6']}
/>
</View>
<ScrollView ref="_scrollView" horizontal={true} pagingEnabled={true}>
<View
style={{
flex: 1,
width: width,
}}>
<Text style={{padding: 15, textAlign: 'justify'}}>
{this.props.info}
</Text>
</View>
<View
style={{
flex: 1,
width: width,
padding: 15,
}}>
<TextInput
style={{
height: 150,
borderColor: 'gray',
borderWidth: 0.5,
borderRadius: 25,
}}
multiline={true}
onChangeText={comment => this.setState({comment})}
/>
<View
style={{flexDirection: 'row', justifyContent: 'space-between'}}>
<View style={{marginTop: 20}}>
<AirbnbRating
count={5}
showRating={false}
onFinishRating={this.ratingCompleted}
defaultRating={0}
size={30}
fractions={2}
/>
</View>
<TouchableOpacity
style={{
width: width * 0.3,
height: height * 0.06,
marginTop: 15,
marginBottom: 15,
borderRadius: 15,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#1a345c',
flexDirection: 'row',
}}
onPress={() =>
addItem(
this.state.comment,
this.props.locID,
this.state.userName,
this.state.rating,
this.state.comments,
this.props.locID,
)
}>
<Text style={{color: 'white'}}>Değerlendir</Text>
</TouchableOpacity>
</View>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 25,
marginTop: 15,
}}>
Yorumlar
</Text>
{commentContext}
</View>
</ScrollView>
</ScrollView>
<View style={styles.lineFooterStyle} />
<View style={styles.footerStyle}>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Mainpage')}>
<Image
style={styles.navItemHomeStyle}
source={require('../../img/Home.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Discover')}>
<Image
style={styles.navItemBookmarkStyle}
source={require('../../img/Bookmark_2.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('MyProfile')}>
<Image
style={styles.navItemProfileStyle}
source={require('../../img/Profile.png')}
/>
</TouchableOpacity>
</View>
</View>
);
}
}
您可以使用
this.props.navigation.navigate('Example', { locID: "", tourInfo: "", userName: "", userEmail: "" });
在 Mapview.js 中,当您导航到另一个页面时,然后在 ShowInfo.js 中,您会像这样得到它们:
var locID = this.props.navigation.getParam('locID', "");
var tourInfo= this.props.navigation.getParam('tourInfo', "");
var userName= this.props.navigation.getParam('userName', "");
var userEmail= this.props.navigation.getParam('userEmail', "");
如果您在 MapView 中显示 ShowInfo,那么您可以像这样将数据作为 props 传递:
<ShowInfo data={locID, tourInfo} />
然后在 ShowInfo 中,从道具中获取数据,如下所示:
const locID = this.props.data.locID
const tourInfo = this.props.data.tourInfo
这可能是你最好的选择,因为我看到你没有使用 React Navigation,所以我猜一个组件将在另一个组件中呈现。
还有一条建议,尽量与您使用样式的方式保持一致。要么保持所有样式内联,要么为所有样式创建一个样式对象。它在性能方面并没有真正产生任何差异,但它确实使您的代码更易于阅读。
我无法将值发送到另一个页面。 locID、tourInfo、userName、userEmail 我想发送这个值。但是我是react-native的新手,我不知道。
我想post在不同的组件中获取信息。
Mapview.js (locID, tourInfo,) => ShowInfo.js
如果你研究代码,你可以帮助我。其实我要做一些很简单的事情,但是我不知道该做什么。
我需要将变量(locID 和 tourInfo)发送到 ShowInfo.js 页面。在地图上打开我的位置。
Mapview.js
import React from 'react';
import {getDistance, getPreciseDistance} from 'geolib'; // Mesafe Fark hesaplama kütüphanesi
import MapView, {Marker, PROVIDER_GOOGLE, Callout} from 'react-native-maps'; // Harita kullanım Kütüphansi
import Geolocation from '@react-native-community/geolocation'; // Anroide konum zaman aşımına uğramasını engellemek için kullanılır
import {Actions} from 'react-native-router-flux'; // yan menü açma ve sayfalar arasında geçiş de kullanılır (cihazın geri tuşu triği var)
import {
StyleSheet, // Stil Sayfası
Image,
View,
Dimensions, // Ekran Pencere Boyurları anlık çeker App dizaynı ona göre yapar
TouchableOpacity,
Text,
} from 'react-native';
const {width, height} = Dimensions.get('window');
import LinearGradient from 'react-native-linear-gradient'; // Düz doğrular yada levhalar yapmak için kullanılır
import MapViewDirections from 'react-native-maps-directions'; // İki mesafe arasında rota oluşturan kod
import ImagePicker from 'react-native-image-picker'; // Kamera kulanma ve cihazdan app resim video yükleme kütüphanesi
import * as firebase from 'firebase'; // firebase kütüphanesi importedildi
let locationRef = db.ref('/Location');
import {db} from '../../components/dbConfig/config';
import {requestAuthorization} from 'react-native-geolocation-service';
if (!firebase.apps.length) {
firebase.initializeApp(db);
}
const rootRef = firebase.database().ref();
export default class Mapview extends React.Component {
constructor(props) {
super(props);
this.state = {
latitude: 0,
longitude: 0,
error: null,
coords: [],
places: null,
selectedLat: '',
selectedLang: '',
distance: '',
};
}
getLocation = () => {
Geolocation.getCurrentPosition(position => {
this.setState({latitude: position.coords.latitude});
this.setState({longitude: position.coords.longitude});
});
};
setLatLang = (lat, lng) => {
this.setState({selectedLat: lat});
this.setState({selectedLang: lng});
};
showCoords() {
const arrayMarkers = [];
var coordsLatLang = [];
var allCoords = [];
var selectedCoordLat = [];
var selectedCoordLang = [];
var dis = [];
Geolocation.getCurrentPosition(position => {
var userLat = position.coords.latitude;
var userLang = position.coords.longitude;
for (let index = 0; index < this.props.locCoord.length; index++) {
coordsLatLang = this.props.locCoord[index].split(',');
allCoords.push(this.props.locCoord[index].split(','));
selectedCoordLat.push(allCoords[index][0]);
selectedCoordLang.push(allCoords[index][1]);
dis.push(
getDistance(
// Mesafe Hesaplama fonciyonu 2 boyutlu
{latitude: userLat, longitude: userLang},
{
latitude: selectedCoordLat[index],
longitude: selectedCoordLang[index],
},
),
);
var lat = coordsLatLang[0];
var lng = coordsLatLang[1];
arrayMarkers.push(
<Marker
pinColor={'#24012f'}
coordinate={{
latitude: Number(lat),
longitude: Number(lng),
}}>
<Callout
tooltip
style={{position: 'relative'}}
onPress={() => {
this.setLatLang(
selectedCoordLat[index],
selectedCoordLang[index],
);
**if ((dis[index] / 1000).toFixed(2) < 0.5) { ----------------------------
Actions.ShowInfo({
locationID: this.props.locationID,
userName: this.props.userName,
rating: this.props.rating,
locID: this.props.locID,
});
}**----------------------------------------------------------
}}>
<LinearGradient
start={{x: 0, y: 0}}
end={{x: 1, y: 0}}
style={{borderRadius: 20}}
colors={['#531c5c', '#4b5cab']}>
<View
style={{
flexDirection: 'column',
alignContent: 'center',
alignItems: 'center',
flex: 1,
padding: 15,
}}>
<Text
style={{color: 'white', fontWeight: 'bold', fontSize: 20}}>
{this.props.locNames[index]}
</Text>
<Text style={{marginTop: 5, color: 'white'}}>
Puanı:{this.props.TourLocRating[index].toFixed(2)}
</Text>
<Text style={{color: 'white'}}>
Mesafe:{(dis[index] / 1000).toFixed(2)}KM
</Text>
<Text style={{marginTop: 5, color: 'white', marginBottom: 5}}>
Rota Oluşturmak İçin Tıklayın!
</Text>
</View>
</LinearGradient>
</Callout>
</Marker>,
);
}
});
this.setState({places: arrayMarkers});
}
openCam() {
// kamera Başalama kodu
ImagePicker.launchCamera(response => {
// Kamerayı başlatır
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.error) {
console.log('ImagePicker Error: ', response.error);
} else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
} else {
const source = {uri: response.uri};
// You can also display the image using data: // Verileri kullanarak da görüntüyü görüntüleyebilirsiniz:
// const source = { uri: 'data:image/jpeg;base64,' + response.data };
this.setState({
avatarSource: source,
});
}
});
}
componentWillMount() {
this.showCoords();
}
componentDidMount() {
this.getLocation();
}
render() {
console.log(this.props.images);
return (
<View style={{flex: 1}}>
<View
style={{
backgroundColor: 'white',
alignItems: 'center',
width: width,
height: height * 0.08,
fontWeight: 'bold',
flexDirection: 'row',
justifyContent: 'flex-start',
}}>
<TouchableOpacity
onPress={() => {
this.props.navigation.goBack();
}}>
<Image
style={{
width: width * 0.05,
height: height * 0.03,
marginTop: 15,
marginBottom: 10,
marginLeft: 5,
}}
source={require('../../img/back.png')}
/>
</TouchableOpacity>
<Image
resizeMode="contain"
style={{marginLeft: width * 0.17}}
source={require('../../img/headerText.png')}
/>
</View>
<View style={[styles.lineFooterStyle]} />
<MapView
provider={PROVIDER_GOOGLE}
region={{
latitude: this.state.latitude,
longitude: this.state.longitude,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
}}
showsUserLocation={true}
style={{flex: 1}}>
{this.state.places}
<MapViewDirections // Rota Oluşturmak
precision={'high'}
origin={{
latitude: this.state.latitude,
longitude: this.state.longitude,
}} // Mevcut Konum
destination={{
latitude: this.state.selectedLat,
longitude: this.state.selectedLang,
}} // Hedef Konum
apikey={'AIzaSyAYGO8DoGtW-v8lEdDbtagGNp5ogtAA8ok'}
strokeWidth={6}
strokeColor="#531959"
/>
</MapView>
<View>
<TouchableOpacity
style={{
width: width * 0.2,
height: width * 0.2,
marginTop: -height * 0.17,
marginLeft: width * 0.4,
}}
onPress={() => this.openCam()}>
<Image
style={{
width: width * 0.2,
height: width * 0.2,
marginTop: 15,
borderRadius: 25,
}}
source={require('../../img/ARLogo.png')}
/>
</TouchableOpacity>
</View>
<View style={styles.lineFooterStyle} />
<View style={styles.footerStyle}>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Mainpage')}>
<Image
style={styles.navItemHomeStyle}
source={require('../../img/Home.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Discover')}>
<Image
style={styles.navItemBookmarkStyle}
source={require('../../img/Bookmark_2.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('MyProfile')}>
<Image
style={styles.navItemProfileStyle}
source={require('../../img/Profile.png')}
/>
</TouchableOpacity>
</View>
</View>
);
}
}
ShowInfo.js
import React from 'react';
import {Actions} from 'react-native-router-flux';
import {
StyleSheet,
Text,
ScrollView,
Image,
View,
Dimensions,
TouchableOpacity,
TextInput,
} from 'react-native';
import {AirbnbRating, Rating} from 'react-native-ratings'; // puanlama kütüphanesi Yıldız verme
import LinearGradient from 'react-native-linear-gradient'; // düz lehva cigi oluşurmak
import * as firebase from 'firebase'; // firebase kütüphanesi importedildi
import {SliderBox} from 'react-native-image-slider-box'; // resim gösterme slider yapama kütüphanesi
const {width, height} = Dimensions.get('window'); // Ekran
import Comment from '../HorizontalSlider/Comment'; // yatay kaydıma yapabilmek için kullanılır.
let userRef = db.ref('/Users');
let commentsRef = db.ref('/LocationComments');
let locationRef = db.ref('/Location');
import {db} from '../../components/dbConfig/config';
if (!firebase.apps.length) {
firebase.initializeApp(db);
}
const rootRef = firebase.database().ref();
const loccommentRef = rootRef.child('LocationComments');
let addItem = (comment, locationID, userName, rating, comments, locID) => {
// kullanıcı konuma yorum yapma işlemi
loccommentRef.push({
comment: comment,
LocationID: locationID,
username: userName,
users: [],
rating: rating,
});
var count = 0;
var newRating = 0;
for (let index = 0; index < comments.length; index++) {
if (locID == comments[index].LocationID) {
count++;
newRating += comments[index].rating;
}
}
var generalNewRating = (newRating + rating - 1) / count;
locationRef.child(locID).update({Rating: generalNewRating});
};
export default class ShowInfo extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
locInfo: [],
comments: [],
comment: '',
userName: '',
userEmail: '',
rating: '',
users: [],
};
}
ratingCompleted = rating => {
this.setState({rating: rating});
};
getUserData() {
userRef.on('value', snapshot => {
let data = snapshot.val();
let users = Object.values(data);
this.setState({users: users});
});
}
getComments() {
commentsRef.on('value', snapshot => {
let data = snapshot.val();
let comments = Object.values(data);
this.setState({comments: comments});
});
}
getLocationData() {
locationRef.on('value', snapshot => {
let data = snapshot.val();
let locInfo = Object.values(data);
this.setState({locInfo: locInfo});
});
}
getUserName = () => {
for (let index = 0; index < this.state.users.length; index++) {
if (this.props.userEmail == this.state.users[index].email) {
return this.state.users[index].username;
}
}
};
updateRating = () => {
var count = 0;
for (let index = 0; index < this.state.comments.length; index++) {
if (this.props.locID == this.state.comments[index].LocationID) {
count++;
}
}
locationRef.child(this.props.locID).update({
Rating:
(this.state.locInfo[this.props.locID].Rating + this.state.rating) /
count,
});
};
componentWillMount() {
this.getLocationData();
this.getUserData();
this.getComments();
}
inRender(images, commentContext, comments, locCoord, locNames) {
console.log(this.state.locInfo[2].Rating, '------');
if (this.getUserName() != null) {
this.setState({userName: this.getUserName()});
}
for (let index = 0; index < this.state.locInfo.length; index++) {
if (this.props.locID == this.state.locInfo[index].ID) {
images = this.state.locInfo[index].Image.split(',');
console.log(
' :LocID değeri********* ',
this.state.locInfo[index],
' --00ss- ',
index,
);
locCoord.push(this.state.locInfo[index].Coordinate);
console.log(locCoord);
locNames.push(this.state.locInfo[index].Name);
}
}
for (let index = 0; index < this.state.comments.length; index++) {
if (this.props.locID == this.state.comments[index].LocationID) {
comments.push(this.state.comments[index]);
}
}
for (let index = 0; index < comments.length; index++) {
if (comments[index].username != '') {
commentContext.push(
<Comment
username={comments[index].username}
comment={comments[index].comment}
rating={comments[index].rating}
/>,
);
}
}
return images;
}
render() {
var locNames = [];
var images = [];
var comments = [];
var commentContext = [];
var locCoord = [];
var retImages = this.inRender(
images,
commentContext,
comments,
locCoord,
locNames,
);
var TourLocRating = [];
TourLocRating.push(this.props.rating);
return (
<View style={{flex: 1, backgroundColor: 'white'}}>
<View
style={{
backgroundColor: 'white',
alignItems: 'center',
width: width,
height: height * 0.08,
fontWeight: 'bold',
flexDirection: 'row',
justifyContent: 'flex-start',
}}>
<TouchableOpacity
onPress={() => {
this.props.navigation.goBack();
}}>
<Image
style={{
width: width * 0.05,
height: height * 0.03,
marginTop: 15,
marginBottom: 10,
marginLeft: 5,
}}
source={require('../../img/back.png')}
/>
</TouchableOpacity>
<Image
resizeMode="contain"
style={{marginLeft: width * 0.17}}
source={require('../../img/headerText.png')}
/>
</View>
<View style={[styles.lineFooterStyle]} />
<ScrollView>
<SliderBox
style={{height: height * 0.4, marginLeft: 5, marginRight: 5}}
imageLoadingColor="white"
dotColor="white"
inactiveDotColor="#90A4AE"
autoplay
disableOnPress
circleLoop
images={retImages}
// Dizi olarak tutulur resimin ya yolu yada linki bulunur
//currentImageEmitter={index => locName = imgSliderHolder[index].Name } //Resim üzerinde lokasyonun adını gösterebilirsin. Resim geldiğinde gerçekleşen func.
//onCurrentImagePressed={index => Actions.ShowInfo({ locImage: images[index], tourName: imgSliderHolder[index].Name, info: imgSliderHolder[index].Info })}
/>
<View style={{marginLeft: 15}}>
<View style={{flexDirection: 'row'}}>
<View style={{flexDirection: 'column'}}>
<View style={{marginTop: 30}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginLeft: height * 0.01,
}}>
{this.props.tourName}
</Text>
<LinearGradient
style={styles.gradientLineStyle}
start={{x: 0, y: 1}}
end={{x: 1, y: 1}}
colors={['#3E276F', '#F9F7F6']}
/>
</View>
<TouchableOpacity
style={styles.BtnStyleLogin}
onPress={() =>
Actions.LocMapview({
locCoord: locCoord,
locNames,
kind: 'location',
TourLocRating,
})
}>
<Text style={{color: 'white'}}>Başla</Text>
</TouchableOpacity>
<View style={{flexDirection: 'row'}}>
<Rating
readonly={true}
startingValue={this.props.rating}
style={{paddingVertical: 10}}
imageSize={20}
/>
<Text
style={{
marginLeft: width * 0.02,
marginBottom: height * 0.015,
marginTop: height * 0.012,
fontWeight: 'bold',
}}>
Puanı:
</Text>
</View>
</View>
<TouchableOpacity onPress={() => this.playSound()}>
<Image
style={{width: 40, height: 40, marginTop: height * 0.1}}
source={require('../../img/sound_button.png')}
/>
</TouchableOpacity>
</View>
<View
style={{
flexDirection: 'row',
marginBottom: 15,
marginTop: 15,
justifyContent: 'space-between',
}}>
<TouchableOpacity
onPress={() => {
this.refs._scrollView.scrollTo();
}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginLeft: height * 0.025,
}}>
Hakkında
</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={() => {
this.refs._scrollView.scrollTo({x: width, y: 0});
}}>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 15,
marginRight: 15,
}}>
Değerlendir
</Text>
</TouchableOpacity>
</View>
<LinearGradient
style={styles.gradientLineStyle}
start={{x: 0, y: 1}}
end={{x: 1, y: 1}}
colors={['#3E276F', '#F9F7F6']}
/>
</View>
<ScrollView ref="_scrollView" horizontal={true} pagingEnabled={true}>
<View
style={{
flex: 1,
width: width,
}}>
<Text style={{padding: 15, textAlign: 'justify'}}>
{this.props.info}
</Text>
</View>
<View
style={{
flex: 1,
width: width,
padding: 15,
}}>
<TextInput
style={{
height: 150,
borderColor: 'gray',
borderWidth: 0.5,
borderRadius: 25,
}}
multiline={true}
onChangeText={comment => this.setState({comment})}
/>
<View
style={{flexDirection: 'row', justifyContent: 'space-between'}}>
<View style={{marginTop: 20}}>
<AirbnbRating
count={5}
showRating={false}
onFinishRating={this.ratingCompleted}
defaultRating={0}
size={30}
fractions={2}
/>
</View>
<TouchableOpacity
style={{
width: width * 0.3,
height: height * 0.06,
marginTop: 15,
marginBottom: 15,
borderRadius: 15,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#1a345c',
flexDirection: 'row',
}}
onPress={() =>
addItem(
this.state.comment,
this.props.locID,
this.state.userName,
this.state.rating,
this.state.comments,
this.props.locID,
)
}>
<Text style={{color: 'white'}}>Değerlendir</Text>
</TouchableOpacity>
</View>
<Text
style={{
color: '#171c69',
fontWeight: 'bold',
fontSize: 25,
marginTop: 15,
}}>
Yorumlar
</Text>
{commentContext}
</View>
</ScrollView>
</ScrollView>
<View style={styles.lineFooterStyle} />
<View style={styles.footerStyle}>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Mainpage')}>
<Image
style={styles.navItemHomeStyle}
source={require('../../img/Home.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('Discover')}>
<Image
style={styles.navItemBookmarkStyle}
source={require('../../img/Bookmark_2.png')}
/>
</TouchableOpacity>
<TouchableOpacity
style={styles.styleInBottombar}
onPress={() => this.props.navigation.navigate('MyProfile')}>
<Image
style={styles.navItemProfileStyle}
source={require('../../img/Profile.png')}
/>
</TouchableOpacity>
</View>
</View>
);
}
}
您可以使用
this.props.navigation.navigate('Example', { locID: "", tourInfo: "", userName: "", userEmail: "" });
在 Mapview.js 中,当您导航到另一个页面时,然后在 ShowInfo.js 中,您会像这样得到它们:
var locID = this.props.navigation.getParam('locID', "");
var tourInfo= this.props.navigation.getParam('tourInfo', "");
var userName= this.props.navigation.getParam('userName', "");
var userEmail= this.props.navigation.getParam('userEmail', "");
如果您在 MapView 中显示 ShowInfo,那么您可以像这样将数据作为 props 传递:
<ShowInfo data={locID, tourInfo} />
然后在 ShowInfo 中,从道具中获取数据,如下所示:
const locID = this.props.data.locID
const tourInfo = this.props.data.tourInfo
这可能是你最好的选择,因为我看到你没有使用 React Navigation,所以我猜一个组件将在另一个组件中呈现。
还有一条建议,尽量与您使用样式的方式保持一致。要么保持所有样式内联,要么为所有样式创建一个样式对象。它在性能方面并没有真正产生任何差异,但它确实使您的代码更易于阅读。