"This" ist innerhalb der Map-Funktion Reactjs undefiniert

101

Ich arbeite mit Reactjs und schreibe eine Menükomponente.

"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>
        );
    }
});

Wann immer ich 'diese' Funktion innerhalb der Karte verwende, ist sie undefiniert, aber außerhalb ist es kein Problem.

Der Fehler:

"Eigenschaft 'Requisiten' von undefined können nicht gelesen werden"

Jeder hilft mir! : ((

iamhuy
quelle

Antworten:

308

Array.prototype.map()Verwenden Sie ein zweites Argument, um festzulegen, worauf thisin der Zuordnungsfunktion verwiesen wird. Übergeben Sie daher thisdas zweite Argument, um den aktuellen Kontext beizubehalten:

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

Alternativ können Sie eine ES6- Pfeilfunktion verwenden , um den aktuellen thisKontext automatisch beizubehalten :

someList.map((item) => {
  ...
})
Jonny Buchanan
quelle
Wenn Sie das zweite Argument übergeben haben, bedeutet dies, dass sich dies auf das globale Objekt bezieht, und wenn ja, warum ist das so?
Eugen Sunic
23
Hmm, aus irgendeinem Grund sehe ich keine thisBindung, selbst wenn ich eine Pfeilfunktion mit TypeScript verwende.
Lucas
1
Ich habe das gleiche Verhalten wie Lucas, indem ich reagiere. Die altmodische Funktionssyntax funktioniert jedoch für mich. Wie seltsam.
MoonBoots89