React App JS — как ссылаться на статический файл JSON

#javascript #reactjs

#javascript #reactjs

Вопрос:

В JS я ссылаюсь на файл на удаленном сервере, например :

 class App extends Component {
constructor(props) {
    super(props);
    let client = this.getParameterByName('client', window.url);
    this.state = {
        sidebarClass: 'open',
        client: client ? client : 'abc-client',
        specUrl: client
            ? `http://<remote-host>/${client}.json`
            : '<remote-host>/abc-client.json',
    };
    this.showAPI = this.showAPI.bind(this);
    this.toggleSidebar = this.toggleSidebar.bind(this);
}
getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[[]]/g, '\$amp;');
    var regex = new RegExp('[?amp;]'   name   '(=([^amp;#]*)|amp;|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/ /g, ' '));
}

showAPI(specURL) {
    this.setState({
        specUrl: 'http://<remotehost>/'   specURL   '.json',
        client: specURL,
    });
}
toggleSidebar() {
    this.setState((prevState) => ({
        sidebarClass: prevState.sidebarClass === 'open' ? '' : 'open',
    }));
}
render() {
    return (
        <div>
            <Sidebar
                showAPI={this.showAPI}
                toggleClass={this.state.sidebarClass}
                toggleSidebar={this.toggleSidebar}
                client={this.state.client}
            />
            <header className="header text-center">
                <div className="text-right">
                    <div className="hamburger" onClick={this.toggleSidebar}>
                        <svg
                            xmlns="http://www.w3.org/2000/svg"
                            viewBox="0 0 30 30"
                            width="30"
                            height="30"
                            focusable="false">
                            <path
                                stroke="#c635d7"
                                strokeWidth="2"
                                strokeLinecap="round"
                                strokeMiterlimit="10"
                                d="M4 7h22M4 15h22M4 23h22"
                            />
                        </svg>
                    </div>
                    <h3 className="heading text-center">{this.state.client}</h3>
                </div>
            </header>
            <section className={`swagger-container ${this.state.sidebarClass}`}>
                <Swagger specUrl={this.state.specUrl} />
            </section>
        </div>


    );
    }
   }
 

Теперь вместо удаленного хоста я хочу связать его с самим приложением react (обслуживать его локально). Я понимаю, что файл должен присутствовать в общей папке, но не понял, как ссылаться на него в описанном выше JavaScript.

Ответ №1:

Для этого вы можете использовать выборку. Если ваш файл xxx.json находится в корне общей папки, используйте:

 const data = fetch('xxx.json');
 

Но почему бы не поместить его непосредственно в папку src / data и загрузить как:

 import data from ‘./data/xxx.json’;
 

Я думаю, что второй способ уменьшает потребность в бесполезном http-запросе, а также потенциально уменьшит размер вашего кода.

Ответ №2:

В следующем примере вы можете видеть и массивировать определенные ДАННЫЕ, это может быть ответ от вашего серверной части после запроса axios или выборки. Вы можете определить ДАННЫЕ для макета ответов в объектах или массивах, как вы предпочитаете

 import React, { useEffect, useState } from 'react';
import { View, Text, TextInput, StyleSheet, Dimensions, SafeAreaView, FlatList, TouchableOpacity, StatusBar } from 'react-native';
import ActionButton from 'react-native-action-button';
import Icon from 'react-native-vector-icons/FontAwesome';
import Header from '../../core/Header/Header';
import DismissKeyboard from '../../libs/DismissKeyboard';
const { width: WIDTH } = Dimensions.get('window');
import Guide from './Guide';

const styles = StyleSheet.create({
  iconQr: {
    fontSize: 36,
    color: 'white',
  },
  inputContainer: {
    marginTop: 10,
  },
  input: {
    height: 45,
    fontSize: 16,
    paddingLeft: 45,
    borderRadius: 10,
    width: WIDTH - 55,
    marginHorizontal: 25,
    backgroundColor: '#FFFFFF',
  },
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
});

const DATA = [
  {
    "empresa": "SHIPNOW",
    "tipo_operacion": "ENTREGA",
    "bultos": 1,
    "sender_empresa": "SUCSHIPNOW",
    "sender_remitente": "SHIPNOW",
    "sender_direccion": "Av. de los Constituyentes 2985",
    "sender_localidad": "CABA",
    "sender_provincia": "CABA",
    "sender_cp": 1428,
    "comprador_apenom": "Lisandro Arguello",
    "comprador_direccion": "Calle Junu00edn 2189",
    "comprador_localidad": "Corrientes",
    "comprador_provincia": "Corrientes",
    "comprador_cp": 3400,
    "usuario:": "shipnow",
    "id:": 166308,
    "zonaOrigen:": "AMBA",
    "fecha_hora:": "2020-10-01 13:20:13",
    "zona:": "NEA",
    "confirmada:": 1,
    "tipo_op:": 0,
    "remito:": null,
    "servicio:": "ENVIO ECOMMERCE",
    "orden:": 1,
    "rrId:": 61972,
    "contrareembolso:": null,
    "codigo_estado:": "011"
  },
  { "empresa": "SHIPNOW", "tipo_operacion": "ENTREGA", "bultos": 1, "sender_empresa": "SUCSHIPNOW", "sender_remitente": "SHIPNOW", "sender_direccion": "Av. de los Constituyentes 2985", "sender_localidad": "CABA", "sender_provincia": "CABA", "sender_cp": 1428, "comprador_apenom": "Mellsa Picchio", "comprador_direccion": "Uruguay 1145", "comprador_localidad": "BBB", "comprador_provincia": "Corrientes", "comprador_cp": 3400, "usuario": "shipnow", "id": 165891, "zonaOrigen": "AMBA", "fecha_hora": "2020-09-30 07:24:41", "zona": "NEA", "confirmada": 1, "tipo_op": 0, "remito": null, "servicio": "ENVIO ECOMMERCE", "orden": 2, "rrId": 61973, "contrareembolso": null, "codigo_estado": "011" },
  { "empresa": "SHIPNOW", "tipo_operacion": "ENTREGA", "bultos": 1, "sender_empresa": "SUCSHIPNOW", "sender_remitente": "SHIPNOW", "sender_direccion": "Av. de los Constituyentes 2985", "sender_localidad": "CABA", "sender_provincia": "CABA", "sender_cp": 1428, "comprador_apenom": "Claudia Silva", "comprador_direccion": "Calle Playa Miramar 2754", "comprador_localidad": "Corrientes", "comprador_provincia": "Corrientes", "comprador_cp": 3400, "usuario": "shipnow", "id": 166152, "zonaOrigen": "AMBA", "fecha_hora": "2020-09-30 16:34:43", "zona": "NEA", "confirmada": 1, "tipo_op": 0, "remito": null, "servicio": "ENVIO ECOMMERCE", "orden": 3, "rrId": 61974, "contrareembolso": null, "codigo_estado": "011" },
  { "empresa": "SHIPNOW", "tipo_operacion": "ENTREGA", "bultos": 1, "sender_empresa": "SUCSHIPNOW", "sender_remitente": "SHIPNOW", "sender_direccion": "Av. de los Constituyentes 2985", "sender_localidad": "CABA", "sender_provincia": "CABA", "sender_cp": 1428, "comprador_apenom": "Claudia Silva", "comprador_direccion": "Azcuenga 1995", "comprador_localidad": "Corrientes", "comprador_provincia": "Corrientes", "comprador_cp": 3400, "usuario": "shipnow", "id": 166153, "zonaOrigen": "AMBA", "fecha_hora": "2020-09-30 16:34:43", "zona": "NEA", "confirmada": 1, "tipo_op": 0, "remito": null, "servicio": "ENVIO ECOMMERCE", "orden": 3, "rrId": 61974, "contrareembolso": null, "codigo_estado": "011" },
  { "empresa": "SHIPNOW", "tipo_operacion": "ENTREGA", "bultos": 1, "sender_empresa": "SUCSHIPNOW", "sender_remitente": "SHIPNOW", "sender_direccion": "Av. de los Constituyentes 2985", "sender_localidad": "CABA", "sender_provincia": "CABA", "sender_cp": 1428, "comprador_apenom": "Claudia Silva", "comprador_direccion": "Urquiza 2050", "comprador_localidad": "Corrientes", "comprador_provincia": "Corrientes", "comprador_cp": 3400, "usuario": "shipnow", "id": 166154, "zonaOrigen": "AMBA", "fecha_hora": "2020-09-30 16:34:43", "zona": "NEA", "confirmada": 1, "tipo_op": 0, "remito": null, "servicio": "ENVIO ECOMMERCE", "orden": 3, "rrId": 61974, "contrareembolso": null, "codigo_estado": "011" },
  { "empresa": "SHIPNOW", "tipo_operacion": "ENTREGA", "bultos": 1, "sender_empresa": "SUCSHIPNOW", "sender_remitente": "SHIPNOW", "sender_direccion": "Av. de los Constituyentes 2985", "sender_localidad": "CABA", "sender_provincia": "CABA", "sender_cp": 1428, "comprador_apenom": "Claudia Silva", "comprador_direccion": "Palmares Valley 50", "comprador_localidad": "Corrientes", "comprador_provincia": "Corrientes", "comprador_cp": 3400, "usuario": "shipnow", "id": 166155, "zonaOrigen": "AMBA", "fecha_hora": "2020-09-30 16:34:43", "zona": "NEA", "confirmada": 1, "tipo_op": 0, "remito": null, "servicio": "ENVIO ECOMMERCE", "orden": 3, "rrId": 61974, "contrareembolso": null, "codigo_estado": "011" },
]


function Delivieries({ navigation, route }) {
  const [selectedId, setSelectedId] = useState(null);
  const [guideNumber, setGuideNumber] = useState(null);

  useEffect(() => route.params?.guideNumber amp;amp; setGuideNumber(route.params?.guideNumber)
    , [route.params?.guideNumber]);

  const renderGuide = ({ item, index }) => {
    console.log(item)
    const backgroundColor = item.id === selectedId ? "#FFFFFF" : "#FFFFFF";
    return (
      <Guide
        item={item}
        index={index}
        onPress={() => setSelectedId(item.id)}
        style={{ backgroundColor }}
      />
    );
  };

  return (
    <>
      <Header title="Entregas pendientes" isHome={false} />
      <View style={{ marginTop: 25, marginLeft: 30, paddingBottom: 5 }}>
        <Text>Ingresar número de ruta</Text>
      </View>
      <DismissKeyboard>
        <View style={{ flex: 0.1, alignItems: 'center', justifyContent: 'center' }}>
          <View style={styles.inputContainer}>
            <TextInput
              value={guideNumber}
              onChangeText={(guideNumber) => setGuideNumber(guideNumber)}
              placeholder="Número de ruta"
              underlineColorAndroid="transparent"
              placeholderTextColor="rgba(0,0,0,0.2)"
              style={styles.input}
            />
          </View>
        </View>
      </DismissKeyboard>
      <SafeAreaView style={styles.container}>
        <FlatList
          data={DATA}
          renderItem={renderGuide}
          keyExtractor={(item) => item.id}
          extraData={selectedId}
        />
      </SafeAreaView>
      <ActionButton
        buttonColor="rgba(231,76,60,1)"
        renderIcon={() => <Icon name="qrcode" style={styles.iconQr} />}
        onPress={() => navigation.navigate('Scanner')}
        position="center"
        size={55}
      />
    </>
  );
};

export default Delivieries;