javascript - 在 map() 函数中标记不会加载
问题描述
我在传单中的标记不会加载到 map 函数中,但它以前做过,我不知道怎么做,因为当我将标记放在 map 函数之外的损坏代码中时,它会显示,但是当它像在 map 函数内部工作时一样标记不会加载。我到处查看堆栈溢出和谷歌,但没有找到重复的答案。这很有帮助,我认为这是一个小错误,但是当我比较 2 时,我无法弄清楚它是什么。
损坏的代码:
import React, { useState, useEffect } from 'react';
import './LiveRouteTile.scss';
import Card from '@material-ui/core/Card';
import CardContent from '@material-ui/core/CardContent';
import markerIconPng from "leaflet/dist/images/marker-icon.png"
import { Icon } from 'leaflet'
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'
import firebase from "../../../firebase"
import { createApiEndpoint, Endpoints } from '../../../api/index';
import axios from "axios";
import { ControlPointDuplicateOutlined } from '@material-ui/icons';
const LiveRouteTile = ({ type }) => {
const [RuuviTag, setRuuviTag] = useState([]);
const [loading, setLoading] = useState(false);
async function PostRawData(rData) {
console.log('test')
return axios.post("api", { rawData: rData })
}
async function checkBoundaries(rdata) {
try {
const response = await PostRawData(rdata)
console.log(response)
const data = response.data
if (22.00 > data.temperature && data.temperature > 4.00) {
console.log('if')
return { data: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-blue.png' }
}
else {
console.log('else')
return { data: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-red.png' }
}
} catch (err) {
console.error(err)
}
// ...
}
const ref = firebase.firestore().collection("RuuviTag");
function getData() {
setLoading(true);
ref.onSnapshot((querySnapshot) => {
const items = [];
querySnapshot.forEach( (doc) => {
let item = doc.data()
Promise.all([
PostRawData(doc.data().RawData),
checkBoundaries(doc.data().RawData),
]).then(function (result) {
item.decryptedData = result[0].data;
item.colorIcon = result[1].data;
console.log(item);
items.push(item);
})
});
setRuuviTag(items);
console.log(items)
console.log('hi')
console.log(RuuviTag);
setLoading(false);
});
}
useEffect(() => {
getData();
}
, []);
return (
<div className="route-tile">
<Card className="route-card" >
<CardContent className="route-card-content">
{loading ? <h1>Loading...</h1> : (<MapContainer className="map" center={[52.09, 5.10]} zoom ={8}>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={[37.7858, -122.401 ]} icon={new Icon({iconUrl: markerIconPng, iconSize: [25, 41], iconAnchor: [12, 41]})} >
<Popup>
</Popup>
</Marker>
{RuuviTag.map((tag) => (
<div key={tag.MAC}>
{console.log(tag.decryptedData.humidity)
}
<Marker position={[tag.Latitude.replace(/,/g, '.') , tag.Longitude.replace(/,/g, '.') ]} icon={new Icon({iconUrl: markerIconPng, iconSize: [25, 41], iconAnchor: [12, 41]})} >
<Popup>
<h1>{tag.MAC}</h1>
</Popup>
</Marker>
</div>
))}</MapContainer>)}
</CardContent>
</Card>
</div>
)
}
export default LiveRouteTile
这是之前工作的代码,但我不知道我改变了什么,为什么标记不会出现
import React,{useState, useEffect} from 'react';
import './LiveRouteTile.scss';
import Card from '@material-ui/core/Card';
import CardContent from '@material-ui/core/CardContent';
import markerIconPng from "leaflet/dist/images/marker-icon.png"
import {Icon} from 'leaflet'
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'
import firebase from "../../../firebase"
import {createApiEndpoint, Endpoints} from '../../../api/index';
import axios from "axios";
const LiveRouteTile = ({type}) => {
const [RuuviTag, setRuuviTag] = useState([]);
const [loading, setLoading] = useState(false);
let [responseData, setResponseData] = React.useState('')
function PostRawData(rData){
axios.post("https://localhost:44332/Convert/", {rawData :rData})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
const ref = firebase.firestore().collection("RuuviTag");
function getData(){
setLoading(true);
ref.onSnapshot((querySnapshot) => {
const items = [];
querySnapshot.forEach((doc)=>{items.push(doc.data());
});
setRuuviTag(items);
setLoading(false);
});
}
useEffect(()=> {
getData();
}
, []);
return (
<div className="route-tile">
<Card className="route-card" >
<CardContent className="route-card-content">
{loading ? <h1>Loading...</h1> : (<MapContainer className="map" center={[52.09, 5.10]} zoom ={8}>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{RuuviTag.map((tag) => (
<div key={tag.MAC}>
<Marker position={[tag.Latitude.replace(/,/g, '.') , tag.Longitude.replace(/,/g, '.') ]} icon={new Icon({iconUrl: markerIconPng, iconSize: [25, 41], iconAnchor: [12, 41]})} >
<Popup>
<h1>{tag.MAC}</h1>
</Popup>
</Marker>
</div>
))}</MapContainer>)}
</CardContent>
</Card>
</div>
)
}
export default LiveRouteTile
如果有人看到我犯的错误,我将不胜感激。也许另一只眼睛会帮助我感谢您的时间。祝你有美好的一天
提前致谢
解决方案
ref.onSnapshot((querySnapshot) => {
const items = [];
querySnapshot.forEach((doc)=>{items.push(doc.data());
// lifetime of the variable items end here at this block.
});
// items will not be reachable here . it will be undefined.
setRuuviTag(items);
getData
在您的函数中更改您的代码如下
const items = [];
ref.onSnapshot((querySnapshot) => {
querySnapshot.forEach((doc)=>{items.push(doc.data());
});
setRuuviTag(items);
推荐阅读
- c - 获取被覆盖的弱符号的地址
- python - Shutil.copy2() Operation not allowed 错误
- .net - 谁在 .NET Core 托管服务中触发 CancellationTokenSource 的 Cancel 方法?
- html - 我可以用 sass 简化这个 css 吗?
- php - 检测 URL 重定向路径 php
- javascript - 循环遍历数组以呈现多个图表
- java - IFile.getFile 区分大小写
- android - 在 Android 游戏中控制精灵动画速度的标准方法
- c++ - 编译简单 boot_mpi 分散程序时出错:没有序列化元素
- python - VS 代码未加载 Python 解释器