#javascript #reactjs
#javascript #reactjs
Вопрос:
Я хочу объявить глобальную переменную внутри функции, а затем использовать ее вне функции. Я попытался поместить JSX внутри функции, чтобы я мог легко получить к ней доступ, но это не работает, потому что средство визуализации возвращает null.
APP.JS:
class App extends React.Component {
render() {
firebase
.database()
.ref()
.limitToLast(1)
.on('child_added', function (childSnapshot) {
var snap = childSnapshot.val();
var category = snap.category;
var condition = snap.condition;
var postname = snap.postname;
var postprice = snap.postprice;
var username = snap.username;
var usernumber = snap.usernumber;
var imageURL = snap.imageURL;
var postdescription = snap.postdescription;
var whatsapplink = 'https://wa.me/' usernumber '?text=';
});
return (
<>
<div></div>
<div style={{float: 'left'}}>
<Ads
imageURL={imageURL}
name={postname}
price={postprice}
category={category}
condition={condition}
description={postdescription}
username={username}
usernumber={usernumber}
whatsapplink={whatsapplink}
/>
</div>
</>
);
}
}
export default App;
Должен ли я написать функцию для получения данных из firebase при рендеринге?
ADS.JS:
import React from 'react';
import '../App.css';
class ads extends React.Component {
render() {
return (
<div>
<img src={this.props.image} alt="image"></img>
<h2>{this.props.name}</h2>
<h2>{this.props.price}</h2>
<h2>{this.props.category}</h2>
<h2>{this.props.condition}</h2>
<h2>{this.props.description}</h2>
<h2>{this.props.username}</h2>
<a href={this.props.whatsapplink}>
<button>Chat with Seller</button>
</a>
</div>
);
}
}
export default ads;
Комментарии:
1. используйте состояние вместо глобальных переменных
2.
I want to declare a global variable inside of a function and then use it outside the function
. Подсказка: НЕ надо, это не то, как должен был использоваться react. Что вы хотите сделать, так это передать его в качестве аргумента вашим компонентам черезprops
. Убедитесь, что ваше жизненное состояние соответствует компоненту общего предка.3. Попробуйте заглянуть в useContext hook. Я бы посоветовал вам передать метод context, который будет использоваться для установки этого глобального значения.
Ответ №1:
React components имеет встроенный объект состояния. Объект состояния — это место, где вы храните значения свойств, которые принадлежат компоненту. Когда объект состояния изменяется, компонент повторно отображает. Для получения дополнительной информации о методах жизненного цикла React ознакомьтесь с этим документом
import React from 'react';
import firebase from 'firebase'
import './App.css'
import Ads from './component/ads.js'
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
category: '',
condition: '',
postname: '',
postprice: '',
username: '',
usernumber: '',
imageURL: '',
postdescription: '',
whatsapplink: ''
}
}
componentDidMount() {
firebase.database().ref().limitToLast(1).on('child_added', (childSnapshot) => {
var snap = childSnapshot.val();
this.setState({
category: snap.category,
condition: snap.condition,
postname: snap.postname,
postprice: snap.postprice,
username: snap.username,
usernumber: snap.usernumber,
imageURL: snap.imageURL,
postdescription: snap.postdescription,
whatsapplink: "https://wa.me/" snap.usernumber "?text=",
})
})
}
render() {
const { category, condition, postname, postprice, username, usernumber, imageURL, postdescription, whatsapplink } = this.state
return (
<>
<div></div>
<div style={{ float: "left" }}>
<Ads
category={category}
condition={condition}
name={postname}
price={postprice}
username={username}
usernumber={usernumber}
imageURL={imageURL}
description={postdescription}
whatsapplink={whatsapplink} />
</div>
</>
)
}
}
export default App;
Комментарии:
1. Хороший ответ, но не могли бы вы, пожалуйста, добавить к нему еще несколько объяснений вместо простого «попробуйте это»
2. Выдает ошибку: не удается прочитать свойство ‘setState’ из null
3. Ваша функция обратного вызова изменяет контекст этого и больше не является классом. Либо используйте функцию со стрелкой, чтобы получить лексический контекст:
.on('value' , (x) => { ....
внутри componentDidMount функция обратного вызова Firebase4. Но почему, хотя …?
Ответ №2:
Если вам действительно нужна ГЛОБАЛЬНАЯ переменная, вы можете использовать window
объект и добавить к нему свойство. Я думаю, это доступно везде.
Вот так:
const myFunction = value => {
window["newprop"] = value
}
Но в целом это не рекомендуется
Комментарии:
1.
But overall, it's not recommended
— тогда, вероятно, можно было бы считать это не полезным ответом?2. @Adam, если кто-то хочет знать, как использовать глобальную переменную, это ответ. Он не просил рекомендаций, и никто другой тоже
3. @fesieg Вы не были на SO достаточно долго, чтобы знать — большинство людей на SO задают вопросы типа: «как мне сделать X», когда они действительно хотят сделать Y. Задача ответчика — сообщить оператору, что они на самом деле не хотят делать X, и вместо этого они должны делать Y.
Ответ №3:
Не стоит определять глобальную переменную в react js, хотя самый простой способ определить глобальную переменную в React js — поместить ее в объект window. Внутри вашего компонента вы можете определить, как
window.myGlobalVar = "I am a global var";
доступ к нему через
window.myGlobalVar
В идеале, если вы хотите передавать данные от компонента к компоненту, вы можете использовать
или можно создать компонент более высокого порядка
Если ваше приложение сложное, вы также можете использовать redux
Комментарии:
1. Достаточно использовать state, изменение реквизитов и состояния вызывает повторные запросы, но когда вы советуете кому-то поместить переменные в окно, это может вызвать ошибки, и это анти-шаблон.
2. Почему все продолжают отвечать: «Это не очень хорошая идея, но вот как вы это делаете»? Вы больше навредите OP, чем поможете им с этими ответами.