2016-02-25 14 views
36

Ho un metodo che il suo scopo principale è quello di impostare una proprietà su un oggetto DOMCome evitare no-param-riassegnare quando si imposta una proprietà su un oggetto DOM

function (el) { 
    el.expando = {}; 
} 

io uso lo stile del codice di AirBnB che rende ESLint lanciare un errore no-param-reassign:

error Assignment to function parameter 'el' no-param-reassign

come posso manipolare un oggetto DOM passato come argomento mentre adeguatamente stile del codice di AirBnB?

Qualcuno ha suggerito di utilizzare /* eslint react/prop-types: 0 */ riferendosi a another issue ma se non sbaglio si applica bene per reagire, ma non per la manipolazione del DOM nativo.

Inoltre, non credo che cambiare lo stile del codice sia una risposta. Credo che uno dei vantaggi dell'uso di uno stile standard sia quello di avere un codice coerente tra i progetti e modificare le regole a proprio piacimento è un uso improprio di uno stile di codice principale come AirBnB.

Per la cronaca, ho chiesto ad AirBnB su GitHub, quello che pensano sia la strada da percorrere in questi casi in issue #766.

+2

disabilitare questa regola? – Mathletics

+0

Nah. In primo luogo, ciò significherebbe disabilitarlo per tutti gli altri casi in cui questa regola ha senso. In secondo luogo, credo che tu segua una guida di stile o no. Almeno se si tratta di una guida di stile seguita da molti sviluppatori in tutti i tipi di progetti. – Lukas

+1

Ma tu stai chiedendo come _non_ obbedire alla styleguide, perché stai facendo quello che sta cercando di prevenire. In ogni caso, basta [disabilitarlo per quella funzione] (http://eslint.org/docs/user-guide/configuring#configuring-rules) – Mathletics

risposta

38

Come @Mathletics suggerisce, è possibile disable the rule del tutto con l'aggiunta di questo al vostro file di .eslintrc.json:

"rules": { 
    "no-param-reassign": 0 
} 

Oppure si potrebbe disabilitare la regola specificamente per le proprietà param

"rules": { 
    "no-param-reassign": [2, { "props": false }] 
} 

alternativa, è possibile disabilitare la regola per quella funzione

/*eslint-disable no-param-reassign*/ 
function (el) { 
    el.expando = {}; 
} 
/*eslint-enable no-param-reassign*/ 

O per quella linea solo

function (el) { 
    el.expando = {}; // eslint-disable-line no-param-reassign 
} 

Si potrebbe anche verificare questo blog post sulla disattivazione ESLint regole appositamente per accogliere guida di stile di Airbnb.

+0

Grazie. Sembra che la maggior parte delle persone trovi la modifica del linter il modo migliore per andare. Applicare questo per una singola linea sembra il miglior compromesso per me adesso. – Lukas

+1

Questo ha davvero senso, ad esempio per i progetti express di nodejs, dove a volte si potrebbe voler modificare 'res.session' immediatamente – David

+0

Se il problema riguarda solo l'impostazione delle proprietà dei parametri di funzione come indicato nella domanda, la risposta di Gyandeep sotto è molto meglio. –

18

È possibile ignorare questa regola dentro il file .eslintrc e disattivarla per le proprietà param come questo

{ 
    "rules": { 
     "no-param-reassign": [2, { 
      "props": false 
     }] 
    }, 
    "extends": "eslint-config-airbnb" 
} 

Questa regola strada è ancora attiva ma non sarà in guardia per le proprietà. Maggiori informazioni: http://eslint.org/docs/rules/no-param-reassign

+0

Questa risposta non è completamente inclusa in quella accettata? –

-2

è possibile utilizzare:

(param) => { 
    const data = Object.assign({}, param); 
    data.element = 'some value'; 
} 
+0

Penso che tu intenda Object.assign – Abhijeet

+0

Questo non modifica solo la copia (come è quella preziosa)? – jtheletter

+1

Questa non è davvero una soluzione perché questo significa * evitare * riassegnazione param creando un nuovo oggetto mentre io ho esplicitamente bisogno di non creare un nuovo oggetto ma modificare quello originale. – Lukas

2

Coloro che desiderano disattivare selettivamente questa regola potrebbe essere interessato a un proposed new option per il no-param-reassign regola che permetterebbe una "lista bianca" dei nomi degli oggetti rispetto a quale parametro la riassegnazione dovrebbe essere ignorata.

+0

Sopra è stato pubblicato come risposta, piuttosto che come commento, a causa della mancanza di punti rep. –

13

Come this article explains, questa regola ha lo scopo di evitare di mutare il arguments object.Se si assegna a un parametro e poi si prova ad accedere ad alcuni dei parametri tramite l'oggetto arguments, può portare a risultati imprevisti.

Si potrebbe mantenere la regola intatto e mantenere lo stile AirBnB utilizzando un'altra variabile per ottenere un riferimento all'elemento DOM e quindi modificare che:

function (el) { 
    var theElement = el; 
    theElement.expando = {}; 
} 

Negli oggetti JS (compresi nodi DOM) sono passati per riferimento, quindi qui el e theElement sono riferimenti allo stesso nodo DOM, ma la modifica di theElement non modifica l'oggetto arguments poiché arguments[0] rimane solo un riferimento a tale elemento DOM.

Questo approccio è accennato nel documentation for the rule:

Examples of correct code for this rule:

/*eslint no-param-reassign: "error"*/ 

function foo(bar) { 
    var baz = bar; 
} 

Personalmente, vorrei solo usare l'approccio "no-param-reassign": ["error", { "props": false }] un paio di altre risposte menzionati. La modifica di una proprietà del parametro non muta ciò a cui si riferisce quel parametro e non deve essere eseguito nei tipi di problemi che questa regola tenta di evitare.

0

È possibile utilizzare i metodi per l'aggiornamento dei dati. Per esempio. "res.status (404)" invece di "res.statusCode = 404" Ho trovato la soluzione. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903

/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsFor": ["$scope"] }]*/ 

app.controller('MyCtrl', function($scope) { 
    $scope.something = true; 
}); 
-1

Dopo la documentation:

function (el) { 
    const element = el 
    element.expando = {} 
} 
+1

Questa risposta era [già fornita] (https://stackoverflow.com/a/42399879/1269037). –