reactjs - 是否可以在没有重定向的情况下在 React 中提交表单?
问题描述
当我提交表单时,我会直接进入黑页,或者它会被重定向到类似这样的内容
?name="..."&type="..."
但我想留在同一个组件中并更新组件,而不会根据状态变化进行重定向。
路线代码:
import Home from './pages/Home';
import Products from './pages/products';
import { Route } from 'react-router-dom';
function App() {
return (
<div className="App">
<h1>App Page</h1>
<Route path="/">
<Home />
<Products />
</Route>
</div>
);
}
export default App;
家庭组件:
import { connect } from 'react-redux';
import { addProduct } from '../actions/shop.Action';
const Home = ({ addProduct }) => {
let name;
let type;
const nameHandler = (e) => {
name = e.target.value;
};
const typeHandler = (e) => {
type = e.target.value;
};
const submitHandler = (e) => {
e.preventDefault();
addProduct({
productName: name,
productType: type,
});
};
return (
<form onSubmit={submitHandler}>
<h1>Add Product</h1>
<label>Product Name</label>
<input type="text" name="pname" onChange={nameHandler} />
<label>Product Type</label>
<input type="text" name="ptype" onChange={typeHandler} />
<button type="submit">Submit</button>
</form>
);
};
const mapDispatchToProps = (dispatch) => ({
addProduct: (product) => dispatch(addProduct(product)),
});
export default connect(null, mapDispatchToProps)(Home);
产品成分:
import {connect} from 'react-redux'
const Products = ({products}) =>{
console.log(products)
return(
<div>
{products.length?products:<p>No Products</p>}
</div>
)
}
const mapStateToProps = (state) =>({
products: state.shop
})
export default connect(mapStateToProps)(Products);
减速机或初始状态:
import { addProductType } from '../actionTypes/shop.actionTypes';
const INIT = [];
const Shop = (state = INIT, action) => {
switch (action.type) {
case addProductType:
const products = [...state]
products.push(action.payload)
return [...state,...products]
default:
return state
}
};
export default Shop;
解决方案
您的代码有几个问题。这是固定版本:
https://codesandbox.io/s/recursing-meitner-80qo0?file=/src/pages/Home.jsx
你的减速机不正确。您在UI中使用了一个object
但期待一个数组。Products
此外,初始状态应该是一个数组。
注意:如果你愿意,你可以使用一个对象,但除非你打算拥有一个巨大的列表并向你的应用程序添加 crud 功能,否则这并不是必需的。此外,对象没有lenght
属性。你会Object.keys
在那种情况下使用。
import { addProductType } from "../actionTypes/shop.actionTypes";
const INIT = [];
const Shop = (state = INIT, action) => {
switch (action.type) {
case addProductType:
return [...state, action.payload];
default:
return state;
}
};
export default Shop;
初始状态应该是一个数组,每次添加一个项目时,前一个状态都必须与当前添加的项目合并并返回一个array
.
在您的产品 UI 中,您没有对产品进行迭代。你需map
要这样做。(您可以使用其他方法,但这是最推荐的方法,而且您不能使用类似的方法,forEach
因为它不会返回任何内容)。
更正:
import { connect } from "react-redux";
const Products = ({ products }) => {
return (
<div>
{products.length > 0
? products.map((product, index) => (
<div key={index}>
<span>{product.productName}</span>
<span>{product.productType}</span>
</div>
))
: "No products"}
</div>
);
};
const mapStateToProps = (state) => ({
products: state.shop
});
export default connect(mapStateToProps)(Products);
注意:对于 key prop,始终建议为每个列表项设置一个唯一标识符。在这种情况下,索引将起作用,因为应用程序的当前范围不处理列表操作。
最后,在您的Home
组件中,您使用局部变量而不是状态变量来捕获输入值。这很好,但是不允许您跟踪值并为任何其他用例(如验证)操作它们。
推荐阅读
- mysql - 在 EntityFrameworkCore 中加载相关数据时出错
- php - 如何检测此 CREATE TABLE SQL 括号之间的代码行?
- python - 嵌套字典 python 中的购物车总价
- python-3.x - LDAP 用户信息
- android - Ionic 在 android Connection Refused 上运行失败
- java - 字节码增强不起作用
- c# - 使用 c# 和 winforms 在标签中显示最后保存的用户 ID 和名称
- r - 如何使用不均匀列表创建数据框
- xamarin - MasterDetailPage:接受页面以外的内容
- python - 在 Keras 中建立功能模型