微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

REACT NATIVE / 我的子组件不重新渲染,尽管道具改变

如何解决REACT NATIVE / 我的子组件不重新渲染,尽管道具改变

我在下面的代码(此处为沙盒 https://codesandbox.io/s/silly-rubin-9ghc5?fontsize=14&hidenavigation=1&theme=dark )中遇到了问题,道具发生了变化,但不会相应地刷新组件。

我希望能够在父节点的某个状态内跟踪不同的投票/选项,因此我使用了一个数组,其中索引是我的选项的索引,值是投票数。

import { useEffect,useState } from "react";
import { Button,View } from "react-native";

import "./styles.css";

const myList = [
  {
    cid: 0,cTx: "Paris"
  },{
    cid: 1,cTx: "Lyon"
  },{
    cid: 2,cTx: "Marseille"
  },{
    cid: 3,cTx: "valence"
  },{
    cid: 4,cTx: "Bordeaux"
  }
];

interface mTprop {
  myItemId: number;
  myItemTxt: string;
  myItemSt: number[];
  myItemClck: () => void;
}

const MyItem = (props: mTprop) => {
  const onBtPress = () => {
    props.myItemClck();
    console.log(props.myItemSt);
  };

  return (
    <View
      style={{
        flexDirection: "row"
      }}
    >
      <h3>{props.myItemTxt}</h3>
      <Button onPress={onBtPress} title="Learn More" />
      <h3>{props.myItemSt[props.myItemId]}</h3>
    </View>
  );
};

export default function App() {
  const [selectedOpt,setSelectedOpts] = useState(new Array(0));

  useEffect(() => {
    setSelectedOpts(new Array(myList.length).fill(0));
  },[]);

  const updateOptions = (ix: number) => {
    ++selectedOpt[ix];
    setSelectedOpts(selectedOpt);
  };

  return (
    <div className="App">
      <h1>Hello CodeSandBox</h1>
      <h2>Start editing to see some magic happen!</h2>
      {myList.map((itm,ix) => {
        return (
          <MyItem
            key={ix}
            myItemId={ix}
            myItemTxt={itm.cTx}
            myItemSt={selectedOpt}
            myItemClck={() => updateOptions(ix)}
          />
        );
      })}
    </div>
  );
}

预先感谢一百万!

如果需要更多信息,请告诉我

解决方法

为了改变列表中的数据。你需要这样做

 const updateOptions = (ix: number) => {
    const newList = selectedOpt.map((m,i) => {
      if (i === ix) {
        return m + 1;
      }
      return m;
    });
    setSelectedOpts(newList);
  };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。