【问题标题】:Not updating the state instantly不立即更新状态
【发布时间】:2018-09-26 12:12:41
【问题描述】:

所以,当我点击 Screen2 上的添加到购物车按钮时,它会将 articleToCart aka cartArticle 记录为空数组...只有当我返回 Screen1 并再次在 Screen2 上时,再次按下添加到购物车按钮即使单击了“添加到购物车”按钮 2 次,也将包含一个项目的 cartArticle 数组记录下来...我怎样才能使当我单击“添加到购物车”按钮时,它会立即更新状态?我究竟做错了什么?我正在使用反应导航 v2。是否有可能通过参数设置状态,而不是像这样即时延迟?

class Screen1 extends Component {
  state = {
    articles: {
      article: [],
    },
  cartArticle: []
};

articleToCart = () => {
this.setState(prevState => {
  return {
    cartArticle:  prevState.cartArticle.concat(prevState.articles.article)
    };
  });
};


qrCodeOnReadHandler = ({ data }) => {
fetch(data)
  .then(response => response.json())
  .then(json => [
    console.log(json),
    this.setState({
      ...this.state,
      articles: {
        ...this.state.articles,
        article: json[0],
      }
    }),
    this.props.navigation.navigate("Screen2", {
      addToCartOnPress: () => this.articleToCart(),
      articleToCart: this.state.cartArticle,
    })
  ])
  .catch(err => {
    alert("Nesto ne valja. Pokusajte ponovo!");
    console.log(err);
  });
 };

render() {
  return (

    );
  }
}

第二屏

class Screen2 extends Component {

addToCartHandler = () => {
   const { navigation } = this.props;
   const articleToCart =navigation.getParam("articleToCart","Nedostupno");
    const add = navigation.getParam("addToCartOnPress", "Nedostupno");

console.log(articleToCart);

add();

};

goBackHandler = () => {
   this.props.navigation.goBack();
  };

 render() {
   return (
        <View style={styles.buttons}>
          <CustomButton color="#1DA1F2" onPress={this.goBackHandler}>
            Back
          </CustomButton>

          <CustomButton color="#1DA1F2" onPress={this.addToCartHandler}>
            Add to Cart
          </CustomButton>
    );
  }
}

【问题讨论】:

    标签: reactjs react-native react-native-android react-navigation react-native-navigation


    【解决方案1】:

    在屏幕 1 上的 qrCodeOnReadHandler 中:

    [
        console.log(json),
        this.setState({
          ...this.state,
          articles: {
            ...this.state.articles,
            article: json[0],
          }
        }),
        this.props.navigation.navigate("Screen2", {
          addToCartOnPress: () => this.articleToCart(),
          articleToCart: this.state.cartArticle,
        })
      ]
    

    您正在返回一个以您的函数作为索引的数组。 试着改成这个。

    {
        console.log(json);
        this.setState({
          ...this.state,
          articles: {
            ...this.state.articles,
            article: json[0],
          }
        });
        this.props.navigation.navigate("Screen2", {
          addToCartOnPress: () => this.articleToCart(),
          articleToCart: this.state.cartArticle,
        })
    }
    

    【讨论】:

      【解决方案2】:

      setState 是异步的,设置后无法读取值 .. 但可以使用setState 回调,...像这样:

      .then(json => {
        console.log(json)
        this.setState({
          ...this.state,
          articles: {
            ...this.state.articles,
            article: json[0],
          }
        }, () => {
          this.props.navigation.navigate("Screen2", {
            addToCartOnPress: () => this.articleToCart(),
            articleToCart: this.state.cartArticle,
          })
        })
      })
      

      【讨论】:

      • 编辑:实际上它完全按照以前的方式进行操作,它导航到 Screen2 但 id 不更新状态,我需要再次返回 Screen1 而不是 Screen2,这样我才能看到更改...
      • 如果我执行类似 articleToCart.push(article) 的操作,并且在 Screen2 上的 addToCartHandler 中发送槽参数,我会在单击“添加到购物车”按钮后立即将该文章放入数组中。无需再回头……我怎样才能获得相同的效果而不是像这样突变状态?
      • 啊,我终于明白了真正的问题/意图;)在normal 路由中没有保留反应状态,两个屏幕都将在转换时重新创建。在这种情况下,在隐藏时传递(返回)修改的数据或重新渲染第一个屏幕是错误的......嗯......“正常”解决方案是将状态提升到两个组件的父级(在网络中通常状态被保存到localStorage 在页面之间传递值)。
      • 当我想到它时,状态实际上是在 Screen1 上更新但我的问题是我在 Screen2 上并且我不知道如何重新渲染它......
      • 使用reduxapp state(链接到底部的解决方案)
      猜你喜欢
      • 2020-04-08
      • 2021-11-07
      • 2018-08-05
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多