【问题标题】:Changing the value of an element onclick in ReactJS在 ReactJS 中更改元素 onclick 的值
【发布时间】:2017-05-20 20:03:37
【问题描述】:

我有一个从 json 填充的 Material UI 子菜单。包含此子菜单数组的主菜单项将根据所选择的内容进行更改。见下图

包含子菜单的主菜单项如下所示

    <MenuItem
        primaryText={this.state.selectedLanguage.name}
        rightIcon={<ArrowDropRight />}
        style={{userMenuItem}}
        leftIcon={
            <img className="flag" src={this.state.selectedLanguage.icon}/>
        }
        menuItems={languageMenu} //see below
    />

嵌套菜单来自这里

    const languageMenu =
        <div>
            {languages.map((item, index) => (
                <MenuItem
                    key={index}
                    onClick={this.onLanguageChange}
                    primaryText={languages[index].name}
                    style={{userMenuItem}}
                    leftIcon={
                        <img className="flag" src={languages[index].icon}/>
                    }/>
            ))}
        </div>

最终,数据存储在这样的 json 中

const languages = [
    {
        name: 'English',
        icon: './assets/images/flags/uk.png',
        link: ''
    },
    {
        name: 'Español',
        icon: './assets/images/flags/Spain.png',
        link: ''
    },
    {
        name: 'Français',
        icon: './assets/images/flags/France.png',
        link: ''
    }
 ...
];

在我对 React 的理解不佳的情况下,我在构造函数状态下为所选语言创建了一个初始值

constructor(props) {
    super(props);
    this.state = {          
        selectedLanguage:{
            name:"English",
            icon:"./assets/images/flags/uk.png",
        },
    }
}

以及一个处理变化的函数(这是我的问题,我敢肯定)

onLanguageChange = () => this.setState(
    {
        selectedLanguage: this.state.selectedLanguage.name,
    }
);

我需要正确构建这个onChange() 函数以根据单击的子菜单更改状态。这将为我构建其他属性奠定基础,这些属性也会在点击时触发翻译功能

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 将状态绑定到 MainMenu 按钮,就像您在 LanguageMenu &lt;img className="flag" src={this.state.selectedLanguage.icon}/&gt; 中如何在状态更改时执行此操作一样,通知并更改。阅读facebook.github.io/react-native/docs/state.html
  • @botika 我改变了一些东西。我能够按状态启动值,这很好,因为它现在读取状态。我不知道如何构建 onLanguageChange() 以便它更改状态值

标签: reactjs material-ui


【解决方案1】:

动作需要一个参数 - 新语言:

onLanguageChange = languageName => this.setState({
    selectedLanguage: languageName
});

你需要从onClick传递它:

{languages.map((language, index) => (
    <MenuItem
         key={index}
         onClick={() => this.onLanguageChange(language.name)}
         primaryText={language.name}
         style={{userMenuItem}}
         leftIcon={
             <img className="flag" src={language.icon}/>
         }
    />
))}

我不确定您是想将language 存储在您的州还是只存储name。两种方式各有千秋。

【讨论】:

  • 这清除了我的子菜单。它首先说没有定义语言,我得到它是因为我在任何地方都没有语言,所以我使用了语言(我的 json 数据的名称,但这导致子菜单中的输出为空白
  • 顺便说一下,您发布的菜单项是子菜单列表,它使用数据中的所有语言构建一个转发器,并动态创建那么多菜单项。点击事件应该在这里发生,但需要更改的是我的第一个块中的 MenuItem,它是父菜单。图像会给你一个视觉。对不起,如果我的代码似乎不清楚。我试图避免在这里放太多代码
  • @LOTUSMS languagemap 的第一个参数,原来是item。读取或存储您的state 的位置无关紧要,您的两个组件都可以使用它。也许您想对父组件执行操作并将状态保留在那里?
  • 啊!我的道歉,我错过了那个小细节。好的,语言未定义错误消失了,但是当我单击子菜单(即葡萄牙语)时,主菜单是空白的。没有错误,它只是没有接收到新值。可能是 onClick() 没有更新状态吗?主菜单正在读取状态。
  • @LOTUSMS 也许您想将整个language 对象传递给状态?例如this.onLanguageChange(language)?那是我不确定的。
【解决方案2】:

类似的东西

const languages = [...]


constructor(props) {
    super(props);
    this.state = {          
        selectedLanguage: 0
    }
}

onLanguageChange = (index) => this.setState({ selectedLanguage: index });

const mainMenu =    
    <MenuItem
            primaryText={languages[this.state.selectedLanguage].name}
            rightIcon={<ArrowDropRight />}
            style={{userMenuItem}}
            leftIcon={
                <img className="flag" src={languages[this.state.selectedLanguage].icon}/>
            }
            menuItems={languageMenu} //see below
    />

const languageMenu =
    <div>
        {languages.map((item, index) => (
            <MenuItem
                key={index}
                onClick={this.onLanguageChange(index)}
                primaryText={languages[index].name}
                style={{userMenuItem}}
                leftIcon={
                    <img className="flag" src={languages[index].icon}/>
                }/>
        ))}
    </div>

【讨论】:

  • 我在我的原始问题中更新了我的代码。不知道你之前有没有注意到。但是该状态在此处具有名称和图标启动值,并且正在传递给主菜单项。我现在需要的只是让 oinClick 根据 Sulthan 的回答更新状态值。
  • 对不起,我忘记了
  • Sulthan 的回答让它工作了。但你确实帮助我理解了最初的构建。我很感激 +1
  • 但是当您已经将对象作为全局实例时,没有必要将它传递给状态,您正在复制实例。不客气
  • 我来看看。 ;)
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 2016-06-26
  • 1970-01-01
  • 2021-06-23
  • 2014-12-29
  • 2016-06-23
  • 2023-04-01
  • 2019-07-23
相关资源
最近更新 更多