«This» n'est pas défini dans la fonction de carte Reactjs


101

Je travaille avec Reactjs, j'écris un composant de menu.

"use strict";

var React = require("react");
var Menus = React.createClass({

    item_url: function (item,categories,articles) {
        console.log('afdasfasfasdfasdf');
        var url='XXX';
        if (item.type == 1) {
            url = item.categoryId == null ? 'javascript:void(0)' : path('buex_portal_browse_category', {slug: categories[item.categoryId].slug});
        } else if (item.type == 2) {
            url = item.articleId == null ? 'javascript:void(0)' : path('buex_portal_view_article', {slug: articles[item.articleId].slug, id: item.articleId});
        } else {
            url = item.url;
        }
        return url;
    },

    render: function () {
     //   console.log(this.props.menus);  // return correctly
            var menuElements = this.props.menus.map(function (item1) { // return fault : 'cannot read property 'props' of undefined '
            return (
                <div>
                    <li>
                        <a href={this.item_url(item1, this.props.categories, this.props.articles )}>{item1.name} // the same fault above
                            <i class="glyphicon glyphicon-chevron-right pull-right"></i>
                        </a>
                        <div class="sub-menu">
                            <div>
                            {item1._children.map(function (item2) {
                                return (
                                    <div>
                                        <h4>
                                            <a href={this.item_url(item2, this.props.categories, this.props.articles)}>{ item2.name }</a>
                                        </h4>
                                        <ul>
                                            {item2._children.map(function (item3) {
                                                return ( 
                                                    <div><li><a href={this.item_url(item3, this.props.categories, this.props.articles) }>{ item3.name }</a></li></div>
                                                );
                                            })}                   
                                        </ul>
                                    </div>
                                );
                            })}
                            </div>
                        </div>
                    </li>
                </div>
            );
        });

        return (
            <div class="menu">
                <ul class="nav nav-tabs nav-stacked">
                    {menuElements}
                </ul>
            </div>
        );
    }
});

Chaque fois que j'utilise «cette» fonction de carte à l'intérieur, elle n'est pas définie, mais à l'extérieur, ce n'est pas un problème.

L'erreur:

"Impossible de lire la propriété 'props' non définie"

Quelqu'un m'aide! : ((


Réponses:


308

Array.prototype.map()prend un deuxième argument pour définir ce à quoi thisfait référence dans la fonction de mappage, alors passez thiscomme deuxième argument pour préserver le contexte actuel:

someList.map(function(item) {
  ...
}, this)

Vous pouvez également utiliser une fonction de flèche ES6 pour conserver automatiquement le thiscontexte actuel :

someList.map((item) => {
  ...
})

une fois que vous passez le deuxième argument de ceci, cela signifie-t-il que cela se rapporte à l'objet global alors et si oui, pourquoi en est-il ainsi?
Eugen Sunic

23
Hmm, pour une raison quelconque, je ne vois thispas de lien même lorsque vous utilisez une fonction de flèche avec TypeScript.
Lucas

1
J'ai le même comportement que Lucas, en utilisant react. La syntaxe de fonction à l'ancienne fonctionne pour moi cependant. Tellement bizzare.
MoonBoots89
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.