"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! : ((


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) => {
  ...
})

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.