【问题标题】:React Native - Why are my Conditional If/If Else Statements Never Passing?React Native - 为什么我的条件 If/If Else 语句永远不会通过?
【发布时间】:2020-07-05 07:32:07
【问题描述】:

我是 React Native 和 Javascript 的新手,但我在网上找不到任何东西来帮助我解决我遇到的这个问题。

如果语句从未通过,我的“macSong”功能,我不确定为什么,我觉得代码背后的逻辑是合理的,但我的控制台仍然输出“选定的项目是未知的”,因为所有的 if else如果在按下按钮之前已使用下拉菜单,则至少其中一个应该为真时,陈述是“不真实的”。我的 macSong 函数就在我的样式表上方,在我的代码底部。

如果有人可以帮助我,那就太棒了,提前感谢您,如果您需要更多信息来帮助您回答我的问题,请务必告诉我!

import React, { Component, Fragment } from 'react';
import { StyleSheet, Text, TextInput, View, Button, Alert } from 'react-native';
import SearchableDropdown from 'react-native-searchable-dropdown';

var items =[
    {
      id: 1,
      name: 'Happy Music'
    },
    {
      id: 2,
      name: 'Sad Music'
    },
    {
      id: 3,
      name: 'Chill Music'
    },
    {
      id: 4,
      name: 'Hype Music'
    }
];

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedItems: ''
    }
  }

  render() {
    return (
      <View style={ styles.screen }>
      <Fragment>
        {/* Title */}
        <View style={ styles.title }>
          <Text> Which Mac Miller Song Matches Your Mood? </Text>
        </View>
          {/* Single Dropdown Menu */}
          <SearchableDropdown
            onItemSelect={(item) => {
              const items = this.state.selectedItems;
              this.setState({ selectedItems: [...items, item]});
            }}
            containerStyle={{ padding: 25, alignSelf: 'center' }}
            onRemoveItem={(item, index) => {
              const items = this.state.selectedItems.filter((sitem) => sitem.id !== item.id);
              this.setState({ selectedItems: [...items, item] });
            }}
            itemStyle={{
              padding: 10,
              marginTop: 2,
              backgroundColor: '#ddd',
              borderColor: '#bbb',
              borderWidth: 1,
              borderRadius: 5,
            }}
            itemTextStyle={{ color: '#222' }}
            itemsContainerStyle={{ maxHeight: 140 }}
            items={items}
            defaultIndex={''}
            resetValue={false}
            textInputProps={
              {
                placeholder: "What kind of music do you want to hear?",
                underlineColorAndroid: "transparent",
                style: {
                    padding: 12,
                    borderWidth: 1,
                    borderColor: '#ccc',
                    borderRadius: 5,
                },
              }
            }
            listProps={
              {
                nestedScrollEnabled: true,
              }
            }
        />

      {/* Button */}
      <View style={ styles.button }>
        <Button
          title="Press me for a Mac Miller song!"
          onPress={() => 
            this.macSong()}
        />
      </View>
      </Fragment>
      </View>
    );
  }

  /* Different Mood Function */
  macSong() {
    console.log(this.state.selectedItems)
    if (this.state.selectedItems.some(item => item.name === 'Happy Music')) {
      let songs = ['best day ever', 'kool aid & frozen pizza', 'nikes on my feet'];
      let song = songs[Math.floor(Math.random() * songs.length)];
      console.log(song);
    } else if (this.state.selectedItems.some(item => item.name === 'Sad Music')) {
        let songs = ['self care', 'ROS', 'stay', 'whats the use'];
        let song = songs[Math.floor(Math.random() * songs.length)];
        console.log(song);
    } else if (this.state.selectedItems.some(item => item.name === 'Chill Music')) {
        let songs = ['good news', 'claymation', 'the star room'];
        let song = songs[Math.floor(Math.random() * songs.length)];
        console.log(song);
    } else if (this.state.selectedItems.some(item => item.name === 'Hype Music')) {
        let songs = ['donald trump', 'remember', 'weekend'];
        let song = songs[Math.floor(Math.random() * songs.length)];
        console.log(song);
    } else {
        console.log("Selected Item is Unknown");
    }
  }
}

{/* StyleSheet */}
const styles = StyleSheet.create({
  button: {
    padding: 10,
    alignSelf: 'center'
  },
  title: {
    padding: 30,
    alignSelf: 'center',
    textAlign: 'center'
  }
});

【问题讨论】:

    标签: javascript react-native button drop-down-menu conditional-statements


    【解决方案1】:

    this.state.selectedItems 是以下形式的对象数组:

    { id: Number, name: String }
    

    如果我们查看您的 if 语句,您的条件看起来像:

    if (this.state.selectedItems.includes('Happy Music')) {
    

    您的对象数组永远不会包含纯字符串。您想检查 in 是否包含具有该字符串名称的对象。您可以为此使用some。像这样的:

    if (this.state.selectedItems.some(item => item.name === 'Happy Music'))
    

    希望这能让你回到工作状态。查看您的代码,您似乎有机会在此之后简化此逻辑。

    【讨论】:

    • 感谢您的帮助,但是现在,无论我选择哪个下拉菜单,它总是在控制台中输出一首快乐的歌曲。我将用我目前拥有的内容更新问题中的代码
    • 我刚想通了,因为我的selectedItems是一个列表而不是一个字符串,所以我会再次更新代码,但是我怎样才能简化逻辑呢?
    • 所以我把这个this.state = { selectedItems: [] } 改成了这个this.state = { selectedItems: '' },如果我按照顺序,炒作,然后冷静,然后悲伤,然后快乐(基本上从我的 if 语句倒过来,然后它完美地工作,但是如果我在选择happy后选择了其他任何东西,它会输出一首happy歌曲。你知道我该如何解决这个问题吗?
    • this.state = { selectedItems: [] } 似乎是正确的。您希望 selectedItems 成为一个数组
    【解决方案2】:

    首先,您调用macSong(),在按钮按下时没有参数,但在其定义中,您有一个参数macSong(selectedArguments) { ... }。这不是必需的,因为您正在函数中获取this.state.selectedItems。所以正确的是macSong() { ... }

    那么,它应该是this.state.selectedItems.map(item =&gt; item.name).includes("Happy Music") 等,因为item 是一个具有name 作为属性的对象,并且当您检查对象includes("string") 时,您需要检查一个字符串数组(其中map() 可以)。

    【讨论】:

    • selectedItems 参数可以安全地删除,它不被使用。类似地,macSong 可以直接在 onPressonPress={this.macSong} 中传递,而不是制作一个只调用另一个没有参数的函数的胖箭头函数
    • 除非RN不支持some,否则这里不需要mapmap + include 将遍历数组两次,而您只能使用一次 some
    • 没错,some 是首选
    • map 不起作用,给我一个错误“无法读取未定义的属性'map'。”我将如何使用some
    • 实际上,some 也出现同样的错误,为什么会出现这个错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2019-03-05
    • 2021-01-14
    相关资源
    最近更新 更多