如何在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,这意味着我正在导入正确的路径,但没有其他任何路径。

请问正确的方法是什么?

Answers:


204

快速说明:您正在导入一个类,除非它们是静态属性,否则您不能在该类上调用属性。在此处阅读有关类的更多信息: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


好吧,我明白了。可以从这里阅读一些内容探索
js.com/es6/ch_modules.html

2
而是导出包含一堆函数的对象呢?此外,导出此类对象与导出具有静态属性的类的利弊是什么?
hippietrail

2
像我们在这里那样使用命名的导出只是被导出的对象。这就是为什么您可以对导入进行分解的原因。做import functions from './helpers'functions. HelloChandu将在那里。functions是包含所有功能的对象。在此处阅读有关导出的内容:)developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…–
zackify

2
在类上使用一堆静态属性的缺点是您无缘无故地拥有一个类。就像使用您不需要的api。您为什么要new为静态属性上一堂课?在这种情况下导出函数
zackify

从风格上讲,js中的函数通常不是“小写驼峰”吗?
J Woodchuck

75

另一种方法是创建一个帮助文件,在其中有一个const对象,该对象具有作为对象属性的功能。这样,您只能导出和导入一个对象。

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(),但都没有用。
约翰,

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

如果要直接从单个模块/对象访问方法,则将使用此方法。谢谢!
Brett84c

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语句。

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;

如果我想使用this.props.action ...在func1中调用redux动作,如何在React组件类中更改代码?我变得不确定,不是一个对象(正在评估“ _this.props.actions”)
贾斯汀·洛克

我得到了您想要在这里实现的目标。我可以建议的是将回调函数传递给func1。在回调函数中,您可以使用this.props.action分派您的操作。您需要记住的另一件事是,您将必须mapDispatchToProps,我希望您正在这样做。
汉娜·雷曼

为什么const?函数名称前的export关键字有什么区别吗?
米隆

@DinIslamMilon是我唯一的选择。如果我在单独的文件/模块中有功能。我将使它们成为const或对象的属性。我不使用直接功能或导出直接功能。我认为使用其他方式不会造成任何伤害
Hannad Rehman

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

现在的诀窍是在helpers文件夹中有一个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}

当您需要使用它时,应将其导入为“ {}”,因为您没有使用默认的关键字look

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.