برنامه نویسی

سبد خرید جزء کمیت – انجمن 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}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خوب! ما تمام شدیم 🙂

توضیحات تصویر

امیدوارم این پست مفید واقع شود. کد منبع اینجا. متشکرم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا