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.