¿Cómo crear un archivo auxiliar lleno de funciones en react native?

133

Aunque hay una pregunta similar, no puedo crear un archivo con múltiples funciones. No estoy seguro si el método ya está desactualizado o si RN está evolucionando muy rápido. ¿Cómo crear una función de ayuda global en react native?

Soy nuevo en React Native.

Lo que quiero hacer es crear un archivo js lleno de muchas funciones reutilizables y luego importarlo en componentes y llamarlo desde allí.

Lo que he estado haciendo hasta ahora puede parecer estúpido, pero sé que lo pedirás, así que aquí están.

Intenté crear un nombre de clase Chandu y exportarlo así

'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');
  }
}

Y luego lo importo en cualquier componente requerido.

import Chandu from './chandu';

Y luego llámalo así

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

Lo único que funcionó fue el primer console.log, lo que significa que estoy importando la ruta correcta, pero no ninguna otra.

¿Cuál es la forma correcta de hacer esto, por favor?

cjmling
fuente

Respuestas:

204

Nota rápida: está importando una clase, no puede llamar propiedades en una clase a menos que sean propiedades estáticas. Lea más sobre las clases aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

Sin embargo, hay una manera fácil de hacer esto. Si está haciendo funciones auxiliares, debería crear un archivo que exporte funciones como esta:

export function HelloChandu() {

}

export function HelloTester() {

}

Luego impórtelos así:

import { HelloChandu } from './helpers'

o...

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

zackify
fuente
Ok lo tengo Gracias. Tengo que leer algunos de aquí exploringjs.com/es6/ch_modules.html
cjmling
2
¿Qué pasa con la exportación de un objeto que contiene un montón de funciones? Además, ¿cuáles serían las ventajas y desventajas de exportar un objeto así frente a exportar una clase con propiedades estáticas?
hippietrail
2
Usar exportaciones con nombre como estamos aquí es solo un objeto que se exporta. Es por eso que puede desestructurarse en la importación. Hacer import functions from './helpers'. functions. HelloChanduestaré ahí. funciones es un objeto que contiene todas las funciones. Lea sobre la exportación aquí :) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
zackify
2
La desventaja de usar un conjunto de propiedades estáticas en una clase es que tienes una clase sin ningún motivo. Es como usar una API que no necesitas. ¿Por qué newsubirías una clase solo por propiedades estáticas? Exportar una función en ese caso
zackify
Estilísticamente hablando, ¿las funciones en js no suelen ser "minúsculas de camello"?
J Woodchuck
75

Una alternativa es crear un archivo auxiliar donde tenga un objeto constante con funciones como propiedades del objeto. De esta manera solo exporta e importa un objeto.

helpers.js

const helpers = {
    helper1: function(){

    },
    helper2: function(param1){

    },
    helper3: function(param1, param2){

    }
}

export default helpers;

Luego, importe de esta manera:

import helpers from './helpers';

y usar así:

helpers.helper1();
helpers.helper2('value1');
helpers.helper3('value1', 'value2');
c-chavez
fuente
Sé que ha pasado un tiempo, pero una pregunta de seguimiento: ¿hay una forma ordenada de llamar a una de las funciones auxiliares desde otra función auxiliar? Es decir, helper2: function (param1) {helper1 (); }? Intenté con this.helper1 () y solo helper1 () pero ninguno funcionó.
Johan
1
@Johan tryhelper2: function(param1){ helpers.helper1(); }
c-chavez
Este es el método que usaría si desea acceder directamente a métodos desde un módulo / objeto singular. ¡Gracias!
Brett84c
25

Estoy seguro de que esto puede ayudar. Cree el archivo A en cualquier lugar del directorio y exporte todas las funciones.

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 
}

Aquí, en su clase de componente React, simplemente puede escribir una declaración de importación.

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;
Hannad Rehman
fuente
Si quiero llamar a la acción redux en func1 con this.props.action ... ¿cómo cambio el código en la clase de componente React? Me estoy volviendo indefinido no es un objeto (evaluando '_este.props.acciones')
Justin Lok
Tengo lo que estás tratando de lograr aquí. lo que puedo sugerir es pasar una función de devolución de llamada a func1. y dentro de la función de devolución de llamada, puede enviar su acción con this.props.action. Una cosa más que debe tener en cuenta es que tendrá que mapDispatchToProps, espero que lo esté haciendo.
Hannad Rehman
¿por qué const? ¿Hay alguna diferencia en una palabra clave de exportación antes del nombre de la función?
Milon
@DinIslamMilon es solo mi preferencia. si tengo funciones en un archivo / módulo separado. los haré como const o propiedades de objetos. No uso funciones directas ni exporto funciones directas. No veo ningún daño usando lo contrario
Hannad Rehman
18

Para lograr lo que desea y tener una mejor organización a través de sus archivos, puede crear un index.js para exportar sus archivos auxiliares.

Digamos que tiene una carpeta llamada / helpers . Dentro de esta carpeta puede crear sus funciones divididas por contenido, acciones o cualquier cosa que desee.

Ejemplo:

/* 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,
};

Creemos otro archivo que tenga funciones para ayudarlo con las tablas:

/* 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,
};

Ahora el truco es tener un index.js dentro de la carpeta de ayudantes :

/* 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,
};

Ahora puede importar por separado para usar cada función:

import { Table, Utils } from 'helpers';

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

const myName = Utils.formatName(someNameVariable);

Espero que pueda ayudar a organizar sus archivos de una mejor manera.

Italo Borges
fuente
2

prefiero crear una carpeta, su nombre es Utils y crear un índice de página que contenga lo que crees que es tu ayudante

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}

Cuando necesite usar esto, se debe importar como uso "{}" porque no usó la apariencia de palabra clave predeterminada

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

Si quieres usar la clase, puedes hacerlo.

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
G. Guvenal
fuente