سبد خرید جزء کمیت – انجمن DEV

توجه داشته باشید، این پست برای مبتدیان است
در این پست نحوه طراحی یک کامپوننت کمیت / تعداد برنامه خرید تجارت الکترونیک را با اعتبار سنجی regex می بینیم.
این صفحه اصلی و توابع اولیه است، امیدواریم قبلاً آنها را بشناسید.
import React, { useState } from 'react';
import {
View,
Text,
StyleSheet,
TextInput,
TouchableOpacity,
} from 'react-native';
export default function App() {
const [qty, setQty] = useState(0);
return (
<View style={styles.container}>
<View style={styles.qtyLine}>
<TouchableOpacity
onPress={() => qty < 100 && setQty(qty + 1)}
style={styles.btn}>
<Text style={styles.btnText}>{'+'}</Text>
</TouchableOpacity>
<TextInput
keyboardType={'number-pad'}
maxLength={3}
style={styles.qtyInput}
value={'' + qty}
onChangeText={(txt) => {
let num = Number(txt);
if (!isNaN(num) && num > 0 && num < 101) {
setQty(num);
} else setQty(0);
}}
/>
<TouchableOpacity
onPress={() => qty > 0 && setQty(qty - 1)}
style={styles.btn}>
<Text style={styles.btnText}>{'-'}</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={() => setQty(0)}
style={[styles.btn, { marginLeft: 5 }]}>
<Text style={styles.btnText}>{'x'}</Text>
</TouchableOpacity>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'snow',
alignItems: 'center',
justifyContent: 'center',
padding: 10,
paddingTop: 20,
},
qtyLine: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
},
qtyInput: {
marginHorizontal: 10,
borderWidth: 0.5,
borderColor: 'dodgerblue',
padding: 5,
textAlign: 'center',
width: '20%',
},
btn: {
backgroundColor: 'dodgerblue',
paddingVertical: 5,
paddingHorizontal: 10,
borderRadius: 3,
},
btnText: {
color: 'white',
},
});
Number(txt)
// also converts empty string and blank space(s) as 0
در حال حاضر در TextInput onChangeText
رویداد ما در حال بررسی 3 شرط هستیم. بررسی یک متن یک عدد، عدد > 0 و عدد < 101 است. اما این را می توان در یک مرحله با استفاده از اعتبار سنجی regex ساده کرد.
اجازه می دهد تا مؤلفه TextInput را لمس کنیم. که در onChangeText
رویدادی که از آن استفاده می کنیم regex برای اعتبار سنجی رشته داده شده یک عدد است و مقدار آن بین 1 تا 100 است.
TextInput با الگوی RegEx
const qtyRgPtn = /^([0-9][0-9]?|100)$/;
. . .
<TextInput onChangeText={txt =>
qtyRgPtn.test(txt) && setQty(Number(txt))} />
خیلی ساده است نه؟
اکنون علاوه بر آن، زمانی که کاربر تعداد نامعتبر را وارد می کند، یک پیام هشدار برای مدت کوتاهی نشان می دهیم.
const qtyRgPtn = /^([0-9][0-9]?|100)$/;
export default function App() {
const [qty, setQty] = useState(0);
const [qtyError, setQtyError] = useState('');
. . .
<TextInput
onChangeText={(txt) => {
/*
let num = Number(txt);
if (!isNaN(num) && num > 0 && num < 101) {
setQty(num);
} else {
setQty(0);
}
*/
if (qtyRgPtn.test(txt)) setQty(Number(txt));
else {
setQty(0);
if (!txt || !txt.trim().length) {
setQtyError('Qty should be in between 1-100');
setTimeout(() => setQtyError(''), 2000);
}
}
}}
/>
. . .
{/* final child of container */}
{qtyError ? (
<Text style={{ color: 'salmon', fontSize: 12, marginTop: 5 }}>
{qtyError}
</Text>
) : null}
خوب! ما تمام شدیم 🙂
امیدوارم این پست مفید واقع شود. کد منبع اینجا. متشکرم.