【发布时间】:2023-03-25 14:55:02
【问题描述】:
我是 React Native (包括 Redux)编程的“高级初学者”。现在我正努力更新商店(因此重新渲染 UI)。据我所知,我确实遵循了所需的核心规则:
- 创建一个状态的克隆(新对象)并返回一个新的、修改后的状态对象
- 通过触发动作创建者调度动作
对我有什么问题的任何提示将不胜感激:
APP.JS
import React from "react";
import { createStore, combineReducers } from "redux";
import { Provider } from "react-redux";
import Navigator from "./navigation/navigator";
import productReducer from "./store/reducers/products";
const rootReducer = combineReducers({
product: productReducer,
});
const store = createStore(rootReducer);
console.log("Erstellter Store: ", store.getState());
export default function App() {
return (
<Provider store={store}>
<Navigator />
</Provider>
);
}
ACTION.JS
//CREATE CONSTANTS TO AVOID TYPOS IN STRING-IDENTIFYER
export const TOGGLE_PRODUCT = "TOGGLE_PRODUCT";
export const INCREMENT = "INCREMENT";
//ACTION CREATER FUNCTIONS
export const toggleProduct = (id) => {
return {
type: TOGGLE_PRODUCT,
productId: id,
};
};
REDUCER.JS
import { PRODUCTLIST } from "../../data/dummydata";
import { TOGGLE_PRODUCT } from "../actions/products";
const initialState = {
allProducts: PRODUCTLIST,
};
const productReducer = (state = initialState, action) => {
const newProducts = state.allProducts;
switch (action.type) {
case TOGGLE_PRODUCT:
const toggledProduct = newProducts.findIndex(
(el, idx) => el.id === action.productId
);
newProducts[toggledProduct].status === false
? (newProducts[toggledProduct].status = true)
: (newProducts[toggledProduct].status = false);
console.log("Reducer abgearbeitet: ", newProducts);
return {...state, newProducts} ;
default:
return state;
}
};
export default productReducer;
COMPONENT.JS
import { useSelector, useDispatch } from "react-redux";
import React, { useEffect, useCallback } from "react";
import { Text, View, Button, FlatList, StyleSheet } from "react-native";
import Product from "../components/Product";
import { toggleProduct } from "../store/actions/products";
import { increment } from "../store/actions/products";
const ShoppingListScreen = (props) => {
const dispatch = useDispatch();
const toggleProductHandler = (id) => {
dispatch(toggleProduct(id));
};
const Products = useSelector((state) => state.product.allProducts);
return (
<View style={styles.screen}>
<FlatList
data={Products}
renderItem={({ item }) => (
<View
style={
item.status === true ? styles.elementselected : styles.element
}
>
<Product
style={styles.text}
id={item.id}
product={item.product}
department={item.department}
status={item.status}
onClick={() => toggleProductHandler(item.id)}
/>
</View>
)}
/>
<View style={styles.button}>
<Button
title="FERTIG"
onPress={() => {
props.navigation.goBack();
}}
/>
{/* <Button
title='Stand "cartRewe" '
onPress={() => {
props.testFunction1();
}}
/>
<Button
title='Stand "planRewe" '
onPress={() => {
props.testFunction2();
}}
/> */}
</View>
</View>
);
};
const styles = StyleSheet.create({
screen: {
backgroundColor: "#fafafa",
flex: 1,
justifyContent: "flex-start",
},
element: {
backgroundColor: "#ddd",
borderWidth: 2,
borderColor: "#bbb",
borderRadius: 20,
marginVertical: 5,
marginHorizontal: 25,
},
elementselected: {
backgroundColor: "#a0ffa0",
borderWidth: 3,
borderColor: "#64ff64",
borderRadius: 20,
marginVertical: 5,
marginHorizontal: 25,
},
text: {
color: "#333",
// fontSize: 22,
// marginHorizontal: 10
},
button: {
marginVertical: 24,
},
});
export default ShoppingListScreen;
【问题讨论】: