2015-02-21 7 views
12

Vorrei sapere se esiste una procedura consigliata/modo corretto per impostare un menu di scelta rapida per un componente React.Fare clic con il pulsante destro del mouse su React JS

Al momento ho questa ...

// nw is nw.gui from Node-Webkit 
componentWillMount: function() { 
    var menu = new nw.Menu(); 
    menu .append(new nw.MenuItem({ 
     label: 'doSomething', 
     click: function() { 
      // doSomething 
     } 
    })); 

    // I'd like to know if this bit can be done in a cleaner/more succinct way... 
    // BEGIN 
    var that = this; 
    addEventListener('contextmenu', function(e){ 
     e.preventDefault(); 
     // Use the attributes property to uniquely identify this react component 
     // (so different elements can have different right click menus) 
     if (e.target.attributes[0].nodeValue == that.getDOMNode().attributes[0].nodeValue) { 
      menu.popup(e.x, e.y); 
     } 
    }) 
    // END 
}, 

Questo funziona, ma ci si sente un po 'disordinato e mi chiedevo se ci fosse un altro approccio che potrei essere in grado di utilizzare, tutte le informazioni sarebbe molto apprezzato,

Grazie!

+1

Date un'occhiata a questo [articolo] (http://yahooeng.tumblr.com/post/110069372255/menus-dialogs-and-tooltips-oh-my-in-any-web), penso che ti aiuterà. – pablolmiranda

+0

@pablolmiranda Ah, grazie, non avevo visto prima questo articolo. Ho trovato questo video (https://www.youtube.com/watch?v=ecc0JopiZe4) che contiene informazioni su node-webkit, ma non ha nulla di React correlato. Non sapevo se c'era un approccio migliore. Immagino che potrei usare un ID univoco e un div per fare riferimento a questo oggetto che potrebbe essere leggermente più pulito, non ne sono sicuro. Grazie comunque! – Tom

risposta

20

UPDATE:

capito - ecco cosa si può fare

var addMenu; 

componentWillMount: function() { 
    addMenu = new nw.Menu(); 
    addMenu.append(new nw.MenuItem({ 
     label: 'doSomething', 
     click: function() { 
      // doSomething 
     } 
    })); 
}, 

contextMenu: function(e) { 
    e.preventDefault(); 
    addMenu.popup(e.clientX, e.clientY); 
}, 

render: function(){ 
    return <button onClick={this.handleClick} onContextMenu={this.contextMenu}>SomethingUseful</button> 
} 

In rendere è possibile passare una funzione da onContextMenu per quando si verifica un clic destro per questo componente reagire.

+1

Potresti aggiungere un esempio JSFiddle? – Peter

+2

Hey there - Ecco qualcosa che potrebbe essere utile - (https://jsfiddle.net/q09xkja9/3/) Il menu del tasto destro che sto usando (addMenu = new nw.Menu()) è di Node-Webkit che fornisce accesso ai menu nativi. Speriamo che l'esempio ti dia un'idea! – Tom

+0

@Tom Questo JSFiddle dovrebbe funzionare? Tutto quello che vedo è un'area bianca in cui dovrebbero verificarsi gli eventi di output/click. – kojow7

7

ci sono alcune cose da prendere a cuore con menu a comparsa:

  1. dovrebbe essere reso di distanza dal suo genitore e fratelli - preferibilmente in una sovrapposizione che è l'ultimo figlio di document.body
  2. speciale la logica dovrebbe fare attenzione che sia sempre visualizzata sullo schermo e mai ritagliata dai bordi dello schermo
  3. se è presente una gerarchia, i popup figlio devono essere allineati agli elementi del precedente popup (opener).

ho creato una libreria che è possibile utilizzare per realizzare tutti questi:

http://dkozar.github.io/react-data-menu/

Problemi correlati