javascript - 状态更改时 View 未更新

标签 javascript reactjs react-native

所以我得到了一个看起来像这样的按钮列表 enter image description here 我的目标功能是当您按下按钮时,其背景将更改为另一种颜色。

const getUpdatedSelectedItemsArray = (selectedItems, id) => {
    selectedItems = []
    selectedItems.push(id);
    return selectedItems;
};

我使用此函数返回所选项目的列表。目前我只返回一项,但我将其设置为一个数组,以便将来可以处理多个项目。 在渲染函数中我有这样的东西:

<View style={feed_back_page_styles.buttons_wrapper}>
        {
          feedbackButtons.map((item, i) => (
            <TouchableOpacity  style={this.state.selectedItems.includes(item.key)?feed_back_page_styles.pressedStyle:feed_back_page_styles.inputStyle}
                                onPress={()=>this.onButtonPress(item.key)}>
              <Text style={this.state.selectedItems.includes(item.key)?feed_back_page_styles.option_text_style_pressed:feed_back_page_styles.option_text_style}>{item.data}</Text>
          </TouchableOpacity>
          ))
        }
    </View>

feedbackButtons 只是一个带有键和文本的数组。

onButtonPress 方法如下所示:

    onButtonPress = (key) =>{
    updatedItems = getUpdatedSelectedItemsArray(this.state.selectedItems,key);
    this.setState({selectedItems:updatedItems},()=>console.log(this.state.selectedItems));
    console.log("Do smth else here");
  }

问题是 View 不会随着状态更改而更新。当我单击按钮时,状态会更新,但 View 保持不变。

最佳答案

我认为这是错误的

const getUpdatedSelectedItemsArray = (selectedItems, id) => {
    selectedItems = []
    selectedItems.push(id);
    return selectedItems;
};

由于您将 this.state.selectedItems 作为 onButtonPress 中的第一个参数传递,实际上它并没有创建新数组,但使用相同的状态引用和状态不应直接修改,始终使用setState()。 所以基本上你正在做的是:

const getUpdatedSelectedItemsArray = (id) => {
    this.state.selectedItems = []
    this.state.selectedItems.push(id);
    return selectedItems;
};

这是完全错误的,可能是实际问题。 你可以做的是:

const getUpdatedSelectedItemsArray = (selectedItems=[], id) => {
    const items = [...selectedItems]
    items.push(id);
    return items;
};

然后:

    onButtonPress = (key) =>{
        const updatedItems = getUpdatedSelectedItemsArray(key); // since currently you want to keep only 1 item in the list
/* Incase more than 1 items, you can then use this
const updatedItems = getUpdatedSelectedItemsArray(this.state.selectedItems, key); 
*/   
        this.setState({selectedItems:updatedItems},()=>console.log(this.state.selectedItems));
        console.log("Do smth else here");
      }

希望这能解决您的问题。

此外,如果您可以共享您的组件,那么如果您的组件存在其他问题(例如您正在使用 PureComponent),它会有所帮助。

关于javascript - 状态更改时 View 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54579865/

相关文章:

react-native - React Native expo init 命令失败

javascript - iOS Phone 上的 React Native Dev 工具

javascript - 提取字段值并将其应用为 css 颜色值

javascript - 如何在另一个 Javascript 文件中使用我的游戏对象及其函数/变量

javascript - 如何使用 useReducer 实现 react 控制输入?

javascript - 在 ComponentWillMount 之前渲染

node.js - 确保我的 API 仅适用于我的前端

javascript - react : inline if condition then display this div

javascript getelementsbytagname效率

javascript - React Native - 具有较低 zIndex 的按钮出现在具有较高 zIndex 的 View 顶部