首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法添加属性目标,对象不可扩展

无法添加属性目标,对象不可扩展
EN

Stack Overflow用户
提问于 2018-08-16 18:05:21
回答 1查看 2.4K关注 0票数 0

这是MarketElement的模块:

代码语言:javascript
复制
import * as React from 'react'
import {Tabs} from "antd";
import MarketEvent from './MarketEvent';
import TakeOutEvent from './TakeOutEvent';
import PaymentEvent from './PaymentEvent';
import FullReduce from './FullReduce'

const TabPane = Tabs.TabPane;

class RouteContent {

public static allList: RouteContent[] = [
    new RouteContent('marketMain'),
    new RouteContent('fullReduce')
];
public id: string;
public name: string;
public target: JSX.Element;

public constructor(id: string) {
    this.id = id;
    this.Content(id);
}


public Content(id:string):any {
    console.log('传到了父组件:',id);
    switch (id) {
        case 'marketMain':
            this.target = <MarketEvent getName={this.Content}/>;
            break;
        case 'fullReduce':
            this.target = <FullReduce getName={this.Content} />;
            break;
    }
}}

export default class MarketElement extends React.Component<any> {


public state = {
    // target: RouteContent.Content('marketMain')
    target: RouteContent.allList[0]

};

public getChangePage = (passName: string) => {
    this.setState({
        name: passName
    })
};

public componentWillMount(){
    console.log('componentWillMount MarketElement');
}

public componentDidMount(){
    console.log('componentDidMount MarketElement');
}



public render(){
    return(
        <div>
            <Tabs defaultActiveKey="0">
                <TabPane tab="活动管理" key="0">{this.state.target.target}</TabPane>
                <TabPane tab="外卖设置" key="1"><TakeOutEvent/></TabPane>
                <TabPane tab="支付设置" key="2"><PaymentEvent/></TabPane>
            </Tabs>
        </div>
    )
}
}

这是MarketEvent的模块:

代码语言:javascript
复制
import * as React from 'react';

import './MarketEvent.less'

interface MarketEventProps {
   getName: any;
}

export default class MarketEvent extends React.Component<MarketEventProps,any> {

public constructor(props:any) {
    super(props);
}

public componentWillMount(){
    console.log('componentWillMount MarketEvent');
}

public componentDidMount(){
    console.log('componentDidMount MarketEvent');
}

public refName = (name:string) => {
    this.props.getName(name);
};

public render(){
    return(
        <div className="market_event">
            <div className="market_top">
                营销活动
            </div>
            <div className="market_body">
                <ul className="market_ul">
                    <li onClick={this.refName.bind(this,'fullReduce')}><a href="javascript:;"><span className="l1">减</span>
                        <div className="event_box">
                            <h2>店铺满减</h2>
                            <i>促销</i><i>客单价</i>
                            <p>下单满足条件可享受减免</p>
                        </div>
                    </a></li>
                    <li><a href="javascript:;"><span className="l2">店</span>
                        <div className="event_box">
                            <h2>店铺代金券</h2>
                            <i>拉新</i><i>引流</i>
                            <p>进店时可领取店铺专用代金券</p>
                        </div>
                    </a></li>
                    <li><a href="javascript:;"><span className="l3">促</span>
                        <div className="event_box">
                            <h2>折扣促销</h2>
                            <i>新品</i><i>爆款</i>
                            <p>下单满足条件可享受减免</p>
                        </div>
                    </a></li>
                </ul>
            </div>
        </div>
    )
}

}

这是FullReduce的模块:

代码语言:javascript
复制
import * as React from 'react';
import {Button} from "antd";

interface FullReduceProps {
    getName: any
}

export default class FullReduce extends React.Component<FullReduceProps,any> {

public componentWillMount(){
    console.log('componentWillMount  FullReduce');

}

public componentDidMount(){
    console.log('componentDidMount  FullReduce')
}
public refName = (name:string) => {
    this.props.getName(name);
};

public render(){
    return(
        <div>
            <Button htmlType='button' onClick={this.refName.bind(this,'marketMain')}>返回</Button>
            已经进入了店铺满减页面了
        </div>
    )
}

}

我想要达到的效果是在MarketEvent的模块中点击这一项,然后切换到相应列表项的内容,即FullReduce.Then的模块从FullReduce返回到上一个page.But当我点击某一项时,它会报错:无法添加属性目标,对象不可扩展;我不知道为什么,请帮助我,谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 20:23:17

Content方法(方法名称不应以大写字母开头)的目的似乎是更改RouteContent类的target成员。

由于您将此方法作为回调传递,因此需要将其绑定到‘`RouteContent’中:

代码语言:javascript
复制
class RouteContent {

    public id: string;
    public name: string;
    public target: JSX.Element;

    public constructor(id: string) {
        this.id = id;
        this.Content = this.Content.bind(this);
        this.Content(id);
    }

    ....

}

这样,this into Content将一致地引用所需的RouteContent实例。而且Javascript不会抱怨对象不可扩展。您的代码可能还有其他有关组件状态管理的问题,但它将修复所提出的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51874465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档