2017-12-19 4 views
2

Ich bin etwas neu zu funktionaler Programmierung. Hier ist mein aktuelles Paradigma aus meiner React App. Ich habe eine generische Komponente, in die ich eine Funktion übergebe, die optional ein placeholder Argument nehmen kann.Wie man Daten in eine Funktion currying konditional übergibt

<TableColumn field="effectiveDate" format={dateFormatter} sortable>Start Date</TableColumn> 
<TableColumn field="endDate" format={dateFormatter("No End Date")} sortable>End Date</TableColumn> 

Ich glaube, ich muss currying verwenden, um mein Ziel zu erreichen (mit dem ich kurz sprechen werde). Wenn das der Fall, habe ich dateFormatter wie folgt definiert:

export function dateFormatter(placeholder?: string) { 
    return function (date: string) { 
    const attributes: any = { value: date }; 
    if (placeholder) { 
     attributes.placeholder = placeholder; 
    } 
    return <ShortDate {...attributes} />; 
    }; 
} 

Dann, als ich meinen Tisch tatsächlich machen, ich Schleife durch jeden Datensatz und den Wert wie diese:

getRecordValue(record: any, column: React.ReactElement<TableColumnProps>) { 
    const { format, field } = column.props; 
    const cell = field ? record[field] : ""; 
    if (format) { 
     return format()(cell, record); 
    } 
    return cell; 
} 

Ich mag eine einzige dateFormatter-Funktion zu haben, aber in der Lage sein, optional eine placeholder zu übergeben und die Ausführung zu verzögern. Wie kann ich das machen?

+0

Warum Currying und nicht nur ES6-Standardwerte verwenden? –

+0

@GerardvanHelden Ich möchte nur Platzhalter verwenden, wenn es angegeben ist. – im1dermike

+0

'' und innerhalb 'getRecordValue'' ... if (format) {return format (cell); } ... 'Das Curren wird ausgeführt, wenn die ' gerendert wird. Dann hat 'getRecordValue' Zugriff auf den optional erfassten' Platzhalter'. – arpl

Antwort

0

verwenden Sie einfach Requisiten. Überprüfen Sie, ob der Parrent bestimmte Requisiten passiert hat, in Ihrem Fall ist dies format.

class App extends React.component{ 
    render(){ 
    <CustomComponent format={dateFormatter("No End Date")}/> 
    } 
} 

class CustomComponent extends React.component{ 
    constructor(props){ 
    super(props) 
    } 

    render(){ 
    <div> 
     Your content maybe 
     { this.props.format && this.props.format } 
    </div> 
    } 
} 
+1

Ich habe entweder mein Problem schlecht erklärt oder du hast es falsch verstanden. – im1dermike

+1

Ich denke, es ist der erste. –

+0

@CatalinBesleaga er sucht nach einer funktionellen Lösung. 'class' /' extends' ist oo-style und wird nur für zustandsbehaftete Komponenten verwendet. Stateless (nur Requisiten) -Komponenten können * komponiert * (unter Verwendung von Funktionen) anstatt * erweitert * (unter Verwendung von Klassen) sein – naomik

Verwandte Themen