Как создать вспомогательный файл, полный функций, в React Native?

133

Хотя есть аналогичный вопрос, я не могу создать файл с несколькими функциями. Не уверен, что метод уже устарел или нет, так как RN развивается очень быстро. Как создать глобальную вспомогательную функцию в React Native?

Я новичок в React Native.

Я хочу создать файл js, полный множества функций многократного использования, а затем импортировать его в компоненты и вызывать оттуда.

То, что я делал до сих пор, может показаться глупым, но я знаю, что вы попросите об этом, и вот они.

Я попытался создать имя класса Chandu и экспортировать его так

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

И затем я импортирую его в любой требуемый компонент.

import Chandu from './chandu';

А потом назовите это так

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

Единственное, что сработало, - это первый console.log, что означает, что я импортирую правильный путь, но не другие.

Как правильно это сделать?

cjmling
источник

Ответы:

205

Краткое примечание: вы импортируете класс, вы не можете вызывать свойства класса, если они не являются статическими. Подробнее о классах читайте здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes.

Однако есть простой способ сделать это. Если вы создаете вспомогательные функции, вам следует вместо этого создать файл, который экспортирует такие функции:

export function HelloChandu() {

}

export function HelloTester() {

}

Затем импортируйте их так:

import { HelloChandu } from './helpers'

или...

import functions from './helpers' затем functions.HelloChandu

zackify
источник
Хорошо, я понял Спасибо. Надо прочитать некоторые из здесь exploringjs.com/es6/ch_modules.html
cjmling
2
А как насчет экспорта объекта, который содержит кучу функций? Также каковы были бы плюсы и минусы экспорта такого объекта по сравнению с экспортом класса со статическими свойствами?
hippietrail
2
Использование именованного экспорта, как мы здесь, - это просто экспортируемый объект. Вот почему вы можете деструктурировать при импорте. Делай import functions from './helpers'. functions. HelloChanduбуду там. functions - это объект, содержащий все функции. Читайте об экспорте здесь :) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
zackify
2
Минус использования набора статических свойств в классе заключается в том, что у вас есть класс без причины. Это похоже на использование api, которое вам не нужно. Зачем newсоздавать класс только для статических свойств? В этом случае экспортируйте функцию
zackify
Стилистически говоря, разве функции в js не являются «нижним регистром»?
J
75

Альтернативой является создание вспомогательного файла, в котором у вас есть константный объект с функциями в качестве свойств объекта. Таким образом вы экспортируете и импортируете только один объект.

helpers.js

const helpers = {
    helper1: function(){

    },
    helper2: function(param1){

    },
    helper3: function(param1, param2){

    }
}

export default helpers;

Затем выполните импорт следующим образом:

import helpers from './helpers';

и используйте вот так:

helpers.helper1();
helpers.helper2('value1');
helpers.helper3('value1', 'value2');
с-Чавез
источник
Я знаю, что это было давно, но следующий вопрос: есть ли удобный способ вызвать одну из вспомогательных функций из другой вспомогательной функции? Т.е. helper2: function (param1) {helper1 (); }? Я пробовал использовать this.helper1 () и просто helper1 (), но ни один из них не работал.
Johan
1
@Johan tryhelper2: function(param1){ helpers.helper1(); }
c-chavez
Это метод, который вы бы использовали, если хотите получить прямой доступ к методам отдельного модуля / объекта. Спасибо!
Brett84c 07
25

Я уверен, что это может помочь. Создайте fileA в любом месте каталога и экспортируйте все функции.

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 
}

Здесь, в вашем классе компонентов React, вы можете просто написать один оператор импорта.

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;
Ханнад Рехман
источник
Если я хочу вызвать действие redux в func1 с помощью this.props.action ... как мне изменить код в классе компонентов React? Я получаю undefined - это не объект (оценка '_this.props.actions')
Джастин Лок,
Я получил то, чего вы здесь пытаетесь достичь. я могу предложить передать функцию обратного вызова функции func1. а внутри функции обратного вызова вы можете отправить свое действие с помощью this.props.action. еще одна вещь, которую вам нужно иметь в виду, это то, что вам нужно будет mapDispatchToProps, я надеюсь, вы это делаете.
Ханнад Рехман 08
почему const? имеет ли значение ключевое слово экспорта перед именем функции?
Милон
@DinIslamMilon - это единственное, что я предпочитаю. если у меня есть функции в отдельном файле / модуле. я сделаю их как константы или свойства объектов. Я не использую прямые функции и не экспортирую прямые функции. Я не вижу никакого вреда в использовании в противном случае
Ханнад Рехман
18

Чтобы добиться желаемого и улучшить организацию файлов, вы можете создать index.js для экспорта вспомогательных файлов.

Допустим, у вас есть папка / helpers . Внутри этой папки вы можете создавать свои функции, разделенные по содержимому, действиям или чему угодно.

Пример:

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

Давайте создадим еще один файл, в котором есть функции, которые помогут вам с таблицами:

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

Теперь уловка состоит в том, чтобы внутри папки помощников был index.js :

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

Теперь вы можете импортировать отдельно, чтобы использовать каждую функцию:

import { Table, Utils } from 'helpers';

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

const myName = Utils.formatName(someNameVariable);

Надеюсь, это поможет лучше организовать ваши файлы.

Итало Борхес
источник
2

Я предпочитаю создать папку, его имя - Utils, и внутри создать индекс страницы, содержащий то, что, по вашему мнению, вы помогаете

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}

Когда вам нужно использовать это, его следует импортировать как использование "{}", потому что вы не использовали внешний вид ключевого слова по умолчанию

 import {FUNCTION_NAME,findByAttr} from'.whare file is store/utils/index'
Mohammed_Alreai
источник
0

Если вы хотите использовать класс, вы можете это сделать.

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
источник