“This” không được xác định bên trong hàm bản đồ Reactjs


101

Tôi đang làm việc với Reactjs, viết một thành phần 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>
        );
    }
});

Bất cứ khi nào tôi sử dụng hàm bản đồ bên trong 'this', nó không được xác định, nhưng bên ngoài thì không có vấn đề gì.

Lỗi:

"Không thể đọc thuộc tính 'props' của undefined"

Có ai giúp tôi với! : ((


Câu trả lời:


308

Array.prototype.map()lấy đối số thứ hai để đặt những gì thisđề cập đến trong hàm ánh xạ, vì vậy hãy chuyển thislàm đối số thứ hai để bảo toàn ngữ cảnh hiện tại:

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

Ngoài ra, bạn có thể sử dụng chức năng mũi tên ES6 để tự động lưu giữ thisngữ cảnh hiện tại :

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

một khi bạn chuyển đối số thứ hai của điều này, nó có nghĩa là nó sẽ hiển thị cho đối tượng toàn cục khi đó và nếu có, tại sao lại như vậy?
Eugen Sunic

23
Hmm, vì một số lý do, tôi không thấy thisbị ràng buộc ngay cả khi sử dụng hàm mũi tên với TypeScript.
Lucas

1
Tôi có hành vi tương tự như Lucas, sử dụng phản ứng. Tuy nhiên, cú pháp hàm kiểu cũ phù hợp với tôi. Thật kỳ lạ.
MoonBoots89
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.