#javascript #reactjs #return #gatsby #react-props
#javascript #reactjs #Возврат #gatsby #react-props
Вопрос:
новое в react, так что это, вероятно, очень очевидно, но у меня есть функция, которая вычисляет расстояние между пользователем и широтой, lng компонента (из состояния), а затем возвращает значение с помощью returnDistance()
.
export default class Space extends React.Component {
render() {
const userLat = this.props.userLat,
userLng = this.props.userLng;
let lat = this.props.node.latitude,
lng = this.props.node.longitude;
function getDistance(lat1, lon1, lat2, lon2) {
var R = 6371; // km
var dLat = toRad(lat2 - lat1);
var dLon = toRad(lon2 - lon1);
var lat1 = toRad(lat1);
var lat2 = toRad(lat2);
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d;
}
// Converts numeric degrees to radians
function toRad(Value) {
return Value * Math.PI / 180;
}
function returnDistance() {
return getDistance(userLat, userLng, lat, lng).toFixed(1);
}
return (
<Component>
{userLat ?
<ComponentDistance>
{returnDistance()}
<span>km</span>
</ComponentDistance>
: null }
</Component>
)
}
}
Как мне передать значение returnDistance()
родительскому компоненту, если я не могу setState или props в render?
Спасибо
Ответ №1:
Создайте prop с именем что-то вроде onCalculateDistance
и в дочернем элементе сделайте это:
function returnDistance() {
const dist = getDistance(userLat, userLng, lat, lng).toFixed(1);
this.props.onCalculateDistance(dist);
return dist;
}
И затем в родительском компоненте вы можете сделать это:
distanceChange(dist) {
// whatever you want, for example
this.setState({dist});
}
render() {
return (<Space onCalculateDistance=(this.distanceChange)/>)
}
Комментарии:
1. Имейте в виду, что это будет выполняться каждый раз при повторном отображении пространства, поэтому вы можете захотеть сделать что-нибудь, чтобы проверить, изменилось ли значение с прошлого раза, прежде чем делать с ним что-либо дорогостоящее. Вероятно, просто прямой вызов ‘setstate’ — плохая идея, не проверяя, изменилось ли оно
2. Спасибо! Однако я получаю сообщение об ошибке «Не удается прочитать свойство ‘props’ из undefined». И если я добавлю
this.onCalculateDistance = this.onCalculateDistance.bind(this);
в конструктор, я тогда получу «Не удается прочитать свойство ‘bind’ неопределенного». Вы знаете, что не так?3. разместите весь ваш родительский и дочерний код в jsfiddle @mckeever02, и мы сможем посмотреть.
4. Спасибо @TKoL. Возможно, проще, если я просто вставлю их в gists? Вот родительский index.js : gist.github.com/mckeever02/552149b896ce4638cfa107e21790ca11 И дочерний компонент: gist.github.com/mckeever02/4dceae17b857b99b2282dce7c0d3f94f
Ответ №2:
Обычно вы бы сохранили returnDistance()
функцию в родительском компоненте, если вам нужен доступ к ее результату там. Затем вы передаете его в реквизитах компонента, в котором оно будет вызвано.
Комментарии:
1. Если переменные
lat
иlng
определены внутри дочернего компонента — как мне обойти их неопределенность?function returnDistance() { return getDistance(userLat,userLng,lat,lng).toFixed(1); }