javascript - 如何根据 React Native 表单中的字段值更新其他字段?
问题描述
我有 4 个输入字段,如下所示。名称、数量、数量、价格。还有两个文本字段,佣金和总计。
如果用户按价格输入值并计数,则应计算金额(价格 * 计数)。如果用户以价格和金额输入值,则应计算计数(金额/价格)。在这两种情况下,commission=0.02*amount 和 total=amount+commission 都应该更新。
因此,我尝试使用下面的代码片段作为根据价格更新金额和佣金的开始。但它没有更新。
//App.js
import React from "react";
import App1 from "./src/screens/createCoin.jsx";
import * as Font from "expo-font";
export default function App() {
return <App1 />;
}
//createCoins.jsx
import React, { Component, useState } from "react";
import {
Container,
Header,
Content,
H1,
Text,
Form,
Item,
Input,
} from "native-base";
export default function createCoins() {
const [name, setName] = useState("");
const [price, setPrice] = useState("");
const [amount, setAmount] = useState("");
const [commission, setCommission] = useState("");
const [count, setCount] = useState("");
updateDetails = (text, type) => {
console.log("came to update Details...");
if (type === "price") {
const price = parseFloat(text);
setPrice(price);
setAmount(price * count);
setCommission(amount * 0.002);
}
};
return (
<Container>
<Header />
<Content>
<Form>
<Item>
<Input
placeholder="coin name"
onChangeText={(text) => setName(text)}
/>
</Item>
<Item>
<Input
placeholder="number of coins"
onChangeText={(text) => setCount(count)}
/>
</Item>
<Item>
<Input
placeholder="Amount Invested"
onChangeText={(text) => setAmount(amount)}
/>
</Item>
<Item last>
<Input
placeholder="coin price"
onChangeText={(text) => updateDetails(text, "price")}
/>
</Item>
</Form>
<Text>Commission: {commission}</Text>
<Text>Total Amount: {commission + amount}</Text>
</Content>
</Container>
);
}
你能建议一下吗?
如下更改 createCoin.jsx 的代码后。文本字段“总金额”正在更新,但如何更新输入字段金额?我尝试向它添加属性 value={state.amount} 但没有像无效道具一样出现错误。
import React, { Component, useState } from "react";
import {
Container,
Header,
Content,
H1,
Text,
Form,
Item,
Input,
} from "native-base";
export default function createCoins() {
const [name, setName] = useState("");
//const [price, setPrice] = useState("");
//const [amount, setAmount] = useState("");
//const [commission, setCommission] = useState("");
//const [count, setCount] = useState("");
const [state, setState] = useState({
price: 0,
amount: 0,
commission: 0,
count: 0,
});
/*const updatePrice = (value) => {
console.log("came to update Details...");
if (count) {
setPrice(value);
setAmount(value * count);
}
};*/
updateDetails = (text, type) => {
console.log("came to update Details...");
if (type == "count") {
setState({
...state,
count: text,
});
}
if (type === "price") {
console.log("came inside price");
const price = parseFloat(text);
setState({
...state,
price: price,
amount: price * state.count,
commission: state.price * state.count * 0.002,
});
//setPrice(price);
//setAmount(price * count);
//setCommission(amount * 0.002);
console.log("price:" + price);
console.log(state.amount);
console.log(state.commission);
}
};
return (
<Container>
<Header />
<Content>
<Form>
<Item>
<Input
placeholder="coin name"
onChangeText={(text) => setName(text)}
/>
</Item>
<Item>
<Input
placeholder="number of coins"
onChangeText={(text) => updateDetails(text, "count")}
/>
</Item>
<Item>
<Input
placeholder="Amount Invested"
value={state.amount}
onChangeText={(text) => updateDetails(text, "amount")}
/>
</Item>
<Item last>
<Input
placeholder="coin price"
onChangeText={(text) => updateDetails(text, "price")}
/>
</Item>
</Form>
<Text>Commission: {state.commission}</Text>
<Text>Total Amount: {state.commission + state.amount}</Text>
</Content>
</Container>
);
}
解决方案
这就是我所做的
import React, { Component, useState, useEffect, useRef } from "react";
import {
Container,
Header,
Content,
H1,
Text,
Form,
Item,
Input,
} from "native-base";
export default function createCoins() {
const [name, setName] = useState("");
const [amount, setAmount] = useState("");
const [count, setCount] = useState("");
const [price, setPrice] = useState("");
const [commission, setCommission] = useState("");
// used to regulate when calculations are made
const [ focusedInput, setFocus ] = useState(null)
// run an effect when price, count, or amount changes
useEffect(()=>{
// if price and count exist and user isnt changing amount, calculate amount
if(price && count && focusedInput !== 'amount'){
setAmount( price * count );
}
// if price and count exist and user isnt changing count, calculate count
else if(price && amount && focusedInput !== 'count'){
setCount( amount / price )
}
},[price,count,amount])
// when amount changes, update commission and total
useEffect(()=>{
if(isNaN(amount))
setCommission('')
if(amount)
setCommission( amount * 0.002);
},[amount])
return (
<Container>
<Header />
<Content>
<Form>
<Item>
<Input
placeholder="coin name"
onChangeText={setName}
keyboardType="decimal-pad"
/>
</Item>
<Item>
<Input
placeholder="number of coins"
onChangeText={text => setCount(parseFloat(text))}
keyboardType="decimal-pad"
value={count.toString()}
onFocus={()=>setFocus("count")}
/>
</Item>
<Item>
<Input
placeholder="Amount Invested"
onChangeText={text => setAmount(parseFloat(text))}
keyboardType="decimal-pad"
value={amount.toString()}
onFocus={()=>setFocus("amount")}
/>
</Item>
<Item last>
<Input
placeholder="coin price"
onChangeText={text=>setPrice(parseFloat(text))}
keyboardType="decimal-pad"
value={price.toString()}
onFocus={()=>setFocus("price")}
/>
</Item>
</Form>
<Text>Commission: {commission}</Text>
<Text>Total Amount: {commission +amount}</Text>
</Content>
</Container>
);
}
focusedInput
存在以防止在焦点(被更改)时自动计算值。如果没有focusedInput
条件 ifprice
和count
oramount
存在,那么第三个值将从这两个值派生,即使您尝试更改第三个值也是如此。
例如,如果您尝试在count
textInput 字段存在时编辑该字段price
,则该文本字段将在您输入下一个字符之前被覆盖。amount
count
setCount(amount/price)
通过在自动计算其值之前验证该字段是否处于焦点位置,可以避免这种不良影响
推荐阅读
- python - 在 Huey 任务中运行 Scrapy 蜘蛛(django 项目)
- c# - 使用 HttpContent.ReadAsAsync 时代码停止
- postgresql - 备份 keycloak 数据库会备份所有内容吗?
- django - 如何将表单字段错误返回到在不同的 Django 视图中呈现的模板
- css - 如何为 SVG SMIL 动画添加缓动?
- twitter-bootstrap - Laravel 混合 | Bootstrap 弃用警告:不推荐使用 / 进行除法,并将被删除
- node.js - Mongoose 在测试中不抛出 E11000 重复键错误
- java - Volley CallBack 方法没有给出响应?
- vb.net - 除数而不四舍五入且不带小数
- eclipse - 使用 Eclipse 调试 MBED