Come creare un file di supporto pieno di funzioni in reattivo nativo?


133

Sebbene ci sia una domanda simile, non riesco a creare un file con più funzioni. Non sono sicuro se il metodo sia già obsoleto o meno poiché RN si sta evolvendo molto rapidamente. Come creare una funzione di supporto globale in reattivo nativo?

Sono nuovo di React Native.

Quello che voglio fare è creare un file js pieno di molte funzioni riutilizzabili e quindi importarlo in componenti e chiamarlo da lì.

Quello che ho fatto finora potrebbe sembrare stupido, ma so che lo chiederai così eccoli qui.

Ho provato a creare un nome di classe Chandu ed esportarlo in questo modo

'use strict';
import React, { Component } from 'react';
import {
  AppRegistry,
  Text,
  TextInput,
  View
} from 'react-native';


export default class Chandu extends Component {

  constructor(props){
    super(props);
    this.papoy = {
      a : 'aaa'
    },
    this.helloBandu = function(){
      console.log('Hello Bandu');
    },
  }

  helloChandu(){
    console.log('Hello Chandu');
  }
}

E poi lo importa in qualsiasi componente richiesto.

import Chandu from './chandu';

E poi chiamalo così

console.log(Chandu);
console.log(Chandu.helloChandu);
console.log(Chandu.helloBandu);
console.log(Chandu.papoy);

L'unica cosa che ha funzionato è stata la prima console.log, il che significa che sto importando il percorso corretto, ma non altri.

Qual è il modo corretto di farlo per favore?

Risposte:


204

Nota rapida: stai importando una classe, non puoi chiamare le proprietà di una classe a meno che non siano proprietà statiche. Maggiori informazioni sulle lezioni qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

C'è un modo semplice per farlo, però. Se stai creando funzioni di supporto, dovresti invece creare un file che esporta funzioni come questa:

export function HelloChandu() {

}

export function HelloTester() {

}

Quindi importali in questo modo:

import { HelloChandu } from './helpers'

o...

import functions from './helpers' poi functions.HelloChandu


Ok ho capito Grazie. Devo leggere alcuni da qui exploringjs.com/es6/ch_modules.html
— cjmling

2
Che dire invece di esportare un oggetto che contiene un mucchio di funzioni? Inoltre quali sarebbero i pro e i contro dell'esportazione di un tale oggetto rispetto all'esportazione di una classe con proprietà statiche?
— hippietrail,

2
Usare le esportazioni con nome come siamo qui è solo un oggetto esportato. Questo è il motivo per cui è possibile destrutturare sull'importazione. Fare import functions from './helpers'. functions. HelloChandusarà là. funzioni è un oggetto contenente tutte le funzioni. Leggi l'esportazione qui :) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— zackify

2
L'aspetto negativo dell'uso di un gruppo di proprietà statiche su una classe è che hai una classe senza motivo. È come usare un API che non ti serve. Perché dovresti newscegliere una classe solo per le proprietà statiche? Esporta una funzione in quel caso
— zackify

Stilisticamente parlando, le funzioni di js di solito non sono "caso di cammello inferiore"?
— J Woodchuck,

75

Un'alternativa è quella di creare un file di supporto in cui si dispone di un oggetto const con funzioni come proprietà dell'oggetto. In questo modo si esporta e importa solo un oggetto.

helpers.js

const helpers = {
    helper1: function(){

    },
    helper2: function(param1){

    },
    helper3: function(param1, param2){

    }
}

export default helpers;

Quindi, importa in questo modo:

import helpers from './helpers';

e usare in questo modo:

helpers.helper1();
helpers.helper2('value1');
helpers.helper3('value1', 'value2');

So che è passato un po 'di tempo, ma una domanda di follow-up: esiste un modo preciso per chiamare una delle funzioni di supporto all'interno di un'altra funzione di supporto? Vale a dire helper2: function (param1) {helper1 (); }? Ho provato con this.helper1 () e solo helper1 () ma nessuno dei due ha funzionato.
— Johan,

1
@Johan tryhelper2: function(param1){ helpers.helper1(); }
— c-chavez,

Questo è il metodo da utilizzare se si desidera accedere direttamente ai metodi da un singolo modulo / oggetto. Grazie!
— Brett84c,

25

Sono sicuro che questo può aiutare. Crea fileA in qualsiasi punto della directory ed esporta tutte le funzioni.

export const func1=()=>{
    // do stuff
}
export const func2=()=>{
    // do stuff 
}
export const func3=()=>{
    // do stuff 
}
export const func4=()=>{
    // do stuff 
}
export const func5=()=>{
    // do stuff 
}

Qui, nella tua classe di componenti React, puoi semplicemente scrivere una dichiarazione di importazione.

import React from 'react';
import {func1,func2,func3} from 'path_to_fileA';

class HtmlComponents extends React.Component {
    constructor(props){
        super(props);
        this.rippleClickFunction=this.rippleClickFunction.bind(this);
    }
    rippleClickFunction(){
        //do stuff. 
        // foo==bar
        func1(data);
        func2(data)
    }
   render() {
      return (
         <article>
             <h1>React Components</h1>
             <RippleButton onClick={this.rippleClickFunction}/>
         </article>
      );
   }
}

export default HtmlComponents;

Se voglio chiamare l'azione redux in func1 con this.props.action ... come posso cambiare il codice nella classe del componente React? Sto diventando indefinito non è un oggetto (valutando '_this.props.actions')
— Justin Lok

ho quello che stai cercando di ottenere qui. quello che posso suggerire è passare una funzione di callback a func1. e all'interno della funzione di callback, puoi inviare la tua azione con this.props.action. un'altra cosa che devi tenere a mente è che dovrai mappareDispatchToProps, spero che tu lo stia facendo.
— Hannad Rehman,

perché const? fa differenza una parola chiave di esportazione prima del nome della funzione?
— Milon,

@DinIslamMilon è solo la mia preferenza. se ho funzioni in file / modulo separati. li farò come const o proprietà degli oggetti. non utilizzo funzioni dirette o esporta funzioni dirette. non vedo alcun danno usando altrimenti
— hannad rehman

18

Per ottenere ciò che desideri e avere un'organizzazione migliore attraverso i tuoi file, puoi creare un file index.js per esportare i tuoi file di supporto.

Supponiamo che tu abbia una cartella chiamata / helpers . All'interno di questa cartella puoi creare le tue funzioni divise per contenuto, azioni o qualsiasi cosa ti piaccia.

Esempio:

/* Utils.js */
/* This file contains functions you can use anywhere in your application */

function formatName(label) {
   // your logic
}

function formatDate(date) {
   // your logic
}

// Now you have to export each function you want
export {
   formatName,
   formatDate,
};

Creiamo un altro file che ha funzioni che ti aiutano con le tabelle:

/* Table.js */
/* Table file contains functions to help you when working with tables */

function getColumnsFromData(data) {
   // your logic
}

function formatCell(data) {
   // your logic
}

// Export each function
export {
   getColumnsFromData,
   formatCell,
};

Ora il trucco è avere un index.js nella cartella degli helper :

/* Index.js */
/* Inside this file you will import your other helper files */

// Import each file using the * notation
// This will import automatically every function exported by these files
import * as Utils from './Utils.js';
import * as Table from './Table.js';

// Export again
export {
   Utils,
   Table,
};

Ora è possibile importare quindi separatamente per utilizzare ciascuna funzione:

import { Table, Utils } from 'helpers';

const columns = Table.getColumnsFromData(data);
Table.formatCell(cell);

const myName = Utils.formatName(someNameVariable);

Spero che possa aiutarti a organizzare i tuoi file in un modo migliore.


2

preferisco creare una cartella il cui nome è Utils e all'interno creare un indice di pagina che contenga ciò che pensi ti aiuti

const findByAttr = (component,attr) => {
    const wrapper=component.find(`[data-test='${attr}']`);
    return wrapper;
}

const FUNCTION_NAME = (component,attr) => {
    const wrapper=component.find(`[data-test='${attr}']`);
    return wrapper;
}

export {findByAttr, FUNCTION_NAME}

Quando è necessario utilizzarlo, è necessario importarlo come "{}" perché non è stato utilizzato l'aspetto della parola chiave predefinita

 import {FUNCTION_NAME,findByAttr} from'.whare file is store/utils/index'

0

Se vuoi usare la classe, puoi farlo.

Helper.js

  function x(){}

  function y(){}

  export default class Helper{

    static x(){ x(); }

    static y(){ y(); }

  }

App.js

import Helper from 'helper.js';

/****/

Helper.x
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.