反応ネイティブで機能の完全なヘルパーファイルを作成する方法?


133

同様の質問がありますが、複数の機能を持つファイルを作成できません。RNは非常に速く進化しているため、この方法がすでに時代遅れであるかどうかはわかりません。反応ネイティブでグローバルヘルパー関数を作成する方法

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だけでした。つまり、正しいパスをインポートしていますが、他のパスはインポートしていません。

これを行う正しい方法は何ですか?

回答:


203

クイックノート:クラスをインポートしています。静的プロパティでない限り、クラスのプロパティを呼び出すことはできません。クラスの詳細については、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


わかりましたありがとうございます。ここからいくつかを読むようになったexploringjs.com/es6/ch_modules.html
cjmling

2
代わりに、たくさんの関数を含むオブジェクトをエクスポートするのはどうですか?また、そのようなオブジェクトのエクスポートと静的プロパティを持つクラスのエクスポートの長所と短所は何でしょうか?
ヒッピートレイル2017

2
ここにあるような名前付きエクスポートの使用は、エクスポートされるオブジェクトです。これが、インポートで分解できる理由です。してくださいimport functions from './helpers'functions. HelloChanduそこにあります。functionsは、すべての関数を含むオブジェクトです。ここでは、輸出にまで読む:) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
zackify

2
クラスで一連の静的プロパティを使用することの欠点は、理由もなくクラスがあることです。不要なAPIを使用するようなものです。new静的プロパティだけのクラスを作成するのはなぜですか?その場合、関数をエクスポートします
17

文体的に言えば、jsの関数は通常「ラクダの小文字」ではないのですか?
Jウッドチャック、

75

別の方法は、オブジェクトのプロパティとして関数を含むconstオブジェクトがあるヘルパーファイルを作成することです。この方法では、1つのオブジェクトのみをエクスポートおよびインポートします。

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

久しぶりですが、フォローアップの質問です。ヘルパー関数の1つを別のヘルパー関数内から呼び出すためのきちんとした方法はありますか?つまり、helper2:function(param1){helper1(); }?this.helper1()とhelper1()だけを試しましたが、どちらも機能しませんでした。
ヨハン

1
@ヨハントライhelper2: function(param1){ helpers.helper1(); }
c-

これは、単一のモジュール/オブジェクトからメソッドに直接アクセスする場合に使用するメソッドです。ありがとうございました!
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コンポーネントクラスで、単純に1つのインポートステートメントを記述できます。

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」を評価しています)
Justin Lok

私はあなたがここで達成しようとしているものを得ました。私が提案できることは、コールバック関数をfunc1に渡すことです。コールバック関数内では、this.props.actionを使用してアクションをディスパッチできます。もう1つ覚えておく必要があるのは、mapDispatchToPropsを実行する必要があるということです。
hannad rehman 2017

なぜconst?関数名の前にエクスポートキーワードに違いがありますか?
ミロン2017

@DinIslamMilonその唯一の私の好み。別のファイル/モジュールに関数がある場合。オブジェクトのconstまたはpropertyとして作成します。直接関数を使用したり、直接関数をエクスポートしたりしません。他の方法を使用しても害はありません
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,
};

ここでの秘訣は、ヘルパーフォルダー内に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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.