0

0

React Native 的基本级联形式

花韻仙語

花韻仙語

发布时间:2024-11-28 18:48:19

|

895人浏览过

|

来源于dev.to

转载

我想分享我处理级联表单字段的 3 种方法。

  1. 第一种方法是通用的,使用状态变量。
  2. 第二种是使用普通变量和一个布尔状态变量来触发状态效果(刷新页面)。
  3. 第三种是带有普通变量的动态表单字段。

在这篇文章中,我们看到第一种方法,即基于国家、州、城市数据处理级联表单字段的常用方法。

套餐

react-native-element-dropdown
react-native-paper

我们正在使用react-native-element-dropdown作为下拉字段

基页

React Native 的基本级联形式

import react, { usestate, useeffect } from "react";
import { view, text, stylesheet, touchableopacity } from "react-native";
import { dropdown } from "react-native-element-dropdown";

export default function app() {
  return (
    
      
        country
        
        state        
        
        city
        
      
      
        selected country
        {country.selectedcountry.name}
        selected state
        {state.selectedstate.name}
        selected city
        {city.selectedcity.name}
      
      
        reset
      
    
  );
}

const zdropdown = ({
  data,
  labelfield,
  valuefield,
  value,
  onfocus,
  onblur,
  onchange,
  isfocus,
}) => {
  return (
     5}
      maxheight={300}
      searchplaceholder="search..."
      data={data}
      labelfield={labelfield}
      valuefield={valuefield}
      placeholder={!isfocus ? "select item" : "..."}
      value={value}
      onfocus={onfocus}
      onblur={onblur}
      onchange={onchange}
    />
  );
};

const styles = stylesheet.create({
// style props
});

zdropdown 是一个自定义组件。

样本数据

const listcountry = [
  { countryid: "1", name: "india" },
  { countryid: "2", name: "uk" },
  { countryid: "3", name: "canada" },
  { countryid: "4", name: "us" },
];

const listsate = [
  { stateid: "1", countryid: "1", name: "state1_india" },
  { stateid: "4", countryid: "2", name: "state1_uk" },
  { stateid: "7", countryid: "3", name: "state1_canada" },
  { stateid: "10", countryid: "4", name: "state1_us" },
];

const listcity = [
  {
    cityid: "1",
    stateid: "1",
    countryid: "1",
    name: "city1_state1_country1",
  },
   {
    cityid: "6",
    stateid: "2",
    countryid: "1",
    name: "city6_state2_country1",
  },
  {
    cityid: "7",
    stateid: "3",
    countryid: "1",
    name: "city7_state3_country1",
  }, 
  {
    cityid: "23",
    stateid: "8",
    countryid: "3",
    name: "city23_state8_country3",
  }, 
  {
    cityid: "30",
    stateid: "10",
    countryid: "4",
    name: "city30_state10_country4",
  }, 
  {
    cityid: "35",
    stateid: "12",
    countryid: "4",
    name: "city35_state12_country4",
  },
  {
    cityid: "36",
    stateid: "12",
    countryid: "4",
    name: "city36_state12_country4",
  },
];

表单变量

我们使用 4 个状态变量,其中 3 个用于表单字段,其余一个用于触发焦点效果。

export default function app() {
  const [country, setcountry] = usestate({
    data: [],
    selectedcountry: {},
    value: null,
  });
  const [state, setstate] = usestate({
    data: [],
    selectedstate: {},
    value: null,
  });
  const [city, setcity] = usestate({ data: [], selectedcity: {}, value: null });

  const [ddfocus, setddfocus] = usestate({
    country: false,
    state: false,
    city: false,
  });

  return (
    
      
        country
        
        state
        
        city
        
      
      . . .
    
  );
}

焦点和模糊事件比 onchange 事件更容易被触发,因此对于焦点更改,这里使用一个单独的状态变量,以免弄乱下拉数据更改。

负载国家

从示例数据中加载国家/地区下拉列表。 (可以使用api调用

export default function app() {
. . .
  const loadcountry = () => {
    // load data from api call
    setcountry({ data: [...listcountry], selectedcountry: {}, value: null });
  };

  useeffect(() => {
    loadcountry();
  }, []);

return (
. . .
)

对焦/模糊

当选择一个下拉菜单时,该字段必须被聚焦,而其余字段应该被模糊。我们正在使用一个函数来处理这个问题。

  const focusfield = (fld = '') => {
    const obj = { country: false, state: false, city: false };
    if (fld) obj[fld] = true;
    setddfocus(obj);
  };
        country
         focusfield('country')}
          onblur={() => focusfield('')}
          onchange={null}
        />
        state
         focusfield('state')}
          onblur={() => focusfield('')}
          onchange={null}
        />
        city
         focusfield('city')}
          onblur={() => focusfield('')}
          onchange={null}       
        />

React Native 的基本级联形式

我们现在已经完成了一半。

加载状态状态

在选择的国家/地区,我们需要根据所选国家/地区加载相应的 states。

更新国家/地区字段,根据国家/地区选择加载州并关注国家/地区。

  country
   {
      setcountry({
        ...country,
        selectedcountry: item,
        value: item.countryid,
      });
      loadstate(item.countryid);
      focusfield("");
    }}
  />

当国家/地区发生变化时,州和城市都会发生变化。因此,在设置新值之前,我们需要清除现有数据。

E购-新零售系统
E购-新零售系统

“米烁云货宝”,是一款基于云计算的Saas模式新零售系统。以互联网为基础,通过大数据、人工智能等先进技术,对商品的生产、流通、销售、服务等环节转型升级改造,进而重塑业态结构与生态圈。并对线上交易运营服务、线下体验购买及现代物流进行深度融合,所形成的零售新模式。

下载
const loadstate = async (cntid) => {
  // load data from api call
  setstate({ data: [], selectedstate: {}, value: null });
  setcity({ data: [], selectedcity: {}, value: null });
  const arr = listsate.filter((ele) => ele.countryid === cntid);
  setstate({ ...state, data: [...arr] });
  console.log("respective states ", arr);
};

React Native 的基本级联形式

负载城市

并根据选择加载城市字段。

    state
     {
        setstate({ ...state, selectedstate: item, value: item.stateid });
        loadcity(item.stateid);
        focusfield("");
      }}
     />
const loadcity = async (stid) => {
  // load data from api call
  setcity({ data: [], selectedcity: {}, value: null });
  const arr = listcity.filter((ele) => ele.stateid === stid);
  setcity({ ...city, data: [...arr] });
};

React Native 的基本级联形式

一切就绪,表单字段现在可以正常工作了。

React Native 的基本级联形式

如果我们再处理 2 个附加功能,我们就完成了。一种是休息页面,另一种是验证表单并显示警告。

重置页面

表单变量和焦点变量应该被清除。

. . .
const resetform = () => {
  focusfield("");
  setcountry({ data: [...listcountry], selectedcountry: {}, value: null });
  setstate({ data: [], selectedstate: {}, value: null });
  setcity({ data: [], selectedcity: {}, value: null });
};
. . .

   resetform()} style={styles.clrbtn}>
    reset
  
. . .

警告

如果父字段值为空,我们必须显示警告消息。为此,我们使用 paper 中的 snackbar 组件。

import { snackbar } from "react-native-paper";

export default function app() {
  . . .
  const [visible, setvisible] = usestate(false);
  const [snackmsg, setsnackmsg] = usestate("");

  const ontogglesnackbar = () => setvisible(!visible);
  const ondismisssnackbar = () => setvisible(false);
  . . .

  return (
    
    . . .
      
        {snackmsg}
      
    
  );
}

由于 state 和 city 字段有父字段,因此必须验证它们。

        State
         {
            focusField('state');
            if (!country.value) {
              setSnackMsg('Select country');
              onToggleSnackBar();
              focusField('country');
            }
          }}
          . . .
        />
        City
         {
            focusField('city');
            if (!country.value) {
              setSnackMsg('Select country');
              onToggleSnackBar();
              focusField('country');
            } else if (!state.value) {
              setSnackMsg('Select state');
              onToggleSnackBar();
              focusField('state');
            }
          }}
          . . .
        />

React Native 的基本级联形式

是的,就是这样!我们完成了。谢谢。

完整代码参考这里

相关专题

更多
Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

20

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号