我在反应本机应用程序中使用 redux 来获取和显示数据,但它没有更新来自后端的数据更改

Posted

技术标签:

【中文标题】我在反应本机应用程序中使用 redux 来获取和显示数据,但它没有更新来自后端的数据更改【英文标题】:I am using redux in react native application to fetch and display data but its not updating on data change from backend 【发布时间】:2020-06-02 02:08:20 【问题描述】:

我在我的 React-Native 应用程序中使用 Redux。 我正在从 api 调用中获取数据,并在 ListItem 上成功渲染它。 我能够获取和显示数据,但除非我重新访问该页面,否则数据不会自动更新。 甚至值都没有存储到应用程序中 我从构造函数和 componentDidMount 方法中的操作调用方法。 你能检查一下代码并告诉我哪里出错了。

这里是 action.js

import  
    FETCHING_PRODUCT_REQUEST, 
    FETCHING_PRODUCT_SUCCESS, 
    FETCHING_PRODUCT_FAILURE 
 from './types';

export const fetchingProductRequest = () => (
    type : FETCHING_PRODUCT_REQUEST
);

export const fetchingProductSuccess = (json) => (
    type : FETCHING_PRODUCT_SUCCESS,
    payload : json
);

export const fetchingProductFailure = (error) => (
    type : FETCHING_PRODUCT_FAILURE,
    payload : error
);

export const fetchProduct = () => 
    return async dispatch => 
        dispatch(fetchingProductRequest());
        try 
            let response = await fetch("http://phplaravel-325095-1114213.cloudwaysapps.com/api/shop/shop");
            let json = await response.json();
            dispatch(fetchingProductSuccess(json));
         catch(error) 
            dispatch(fetchingProductFailure(error));
        
    

我的 reducer.js

import  
    FETCHING_PRODUCT_REQUEST, 
    FETCHING_PRODUCT_SUCCESS, 
    FETCHING_PRODUCT_FAILURE 
 from './../actions/types';

const initialState = 
    loading : false,
    errorMessage : '',
    shops: []


const products = ( state = initialState, action ) => 
    switch(action.type) 
        case FETCHING_PRODUCT_REQUEST :
            return  ...state, loading: true ;
        case FETCHING_PRODUCT_SUCCESS : 
            return  ...this.state, loading: false, shops: action.payload ;
        case FETCHING_PRODUCT_FAILURE : 
            return  ...state, loading: false, errorMessage: action.payload;
    
;

export default products;

product.js

import * as React from 'react';

import  FlatList , ActivityIndicator from 'react-native';

import  ListItem  from 'react-native-elements';

import  fetchProduct  from './../../actions/products';

import  connect  from 'react-redux';

import propTypes from 'prop-types';

class Product extends React.Component 

  constructor(props) 
    super(props);
    this.props.fetchProduct();
    this.state = 
      loading : true,
      shops : '',
     isFetching: false,
     active : true,
    
   


   fetchProducts() 
    const shopid = 13;
    fetch(`http://phplaravel-325095-1114213.cloudwaysapps.com/api/shop/shop`)
        .then(response => response.json())
          .then((responseJson)=> 
              this.setState(
                 loading: false,
                 shops: responseJson
              )
             alert(JSON.stringify(this.state.shops));
        )
    .catch(error=>console.log(error)) //to catch the errors if any
   

    componentDidMount()
      // this.fetchProducts();
      this.props.fetchProduct().then(this.setState(loading : false));
    



  renderItem = ( item ) => (
  <ListItem
    title=item.name
    subtitle=item.name
    leftAvatar=
      source: item.avatar &&  uri: item.avatar ,
      title: item.name[0]
    
    bottomDivider
    chevron
  />
)

render () 
    if(!this.state.loading)
     
      if(this.props.shopsInfo.loading)
      
        return (
        <ActivityIndicator/>
        )
      
      else
      
        return (
        <FlatList
                vertical
                showsVerticalScrollIndicator=false
                data=this.props.shopsInfo.shops
                renderItem=this.renderItem
              />
      )
      
    
    else
    
      return (
        <ActivityIndicator/>
        )
    
  


Product.propTypes = 
  fetchProduct:  propTypes.func.isRequired
;


const mapStateToProps = (state) => 
  return  shopsInfo: state ;


function mapDispatchToProps (dispatch) 
  return 
    fetchProduct: () => dispatch(fetchProduct())
  
 

export default connect(mapStateToProps, mapDispatchToProps)(Product);

【问题讨论】:

从后端更新数据不会反映在应用程序中,需要定期检查才能实现,您可以通过参考 react native 的生命周期来定制一些方法来获得更好的用户体验 【参考方案1】:

问题是您在 mapStateToProps 函数中传递了错误的道具。 在减速器中,您更新商店道具中的响应值。 为了获取更新后的值,您需要通过 shop 属性来获取值。

const mapStateToProps = (state) =>  
   const  shops: state ;  
   return shops;
 

【讨论】:

const mapStateToProps = (state) => return storesInfo: state ;这里的 shopInfo 就像一个变量,用来存储 props 中的所有状态。 如果您通过了完整状态,然后使用控制台检查mapStateToProps 和组件,您的更新数据是否返回这里。如果您没有收到数据,只需检查您的配置存储,它是否正确更新了减速器。【参考方案2】:

1.不更新来自后端的数据更改。

您必须定期调用 api 来获取更新的数据。 Redux 实现并不意味着它会在有任何变化时从服务器获取数据。

2。甚至值也不会存储到应用中

如果你期望 redux 会存储数据,即使你会关闭/杀死一个应用程序,它也不会。您拥有持久化数据以便使用它或将其存储在缓存中。看看redux-persist

【讨论】:

哦,好的,我明白了。对我来说,更新数据变化很重要。你能为我提供任何快速指南吗? 嗯,据我所知没有直接的方法来实现它。您可以做的只是定期检查数据更改,或者可能是套接字编程,它可以在数据更改时通知您。如果不是大产品,我不会推荐socket。 好的.. 我将使用定期间隔来更新操作中的状态。谢谢你。 :)

以上是关于我在反应本机应用程序中使用 redux 来获取和显示数据,但它没有更新来自后端的数据更改的主要内容,如果未能解决你的问题,请参考以下文章

反应本机中未处理的承诺拒绝错误?

反应本机连接到同一页面中的两个redux

使用 Redux 时反应本机文本输入闪烁

connect将本机app.js文件反应为使用react-native-router-flux的redux

GPS位置在本机反应中波动

远程 redux devtools 停止工作