Как объявить глобальные переменные в функции в ReactJS?

#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 функция обратного вызова Firebase

4. Но почему, хотя …?

Ответ №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, чем поможете им с этими ответами.