前端组件库——UI Kitten知识点大全(二)

简介: 教程来源 https://xcfsr.cn/ UI Kitten主题系统基于Eva Design System,支持亮/暗模式无缝切换、运行时动态换肤及品牌化自定义主题,内置25+组件,开箱即用,兼顾一致性与灵活性。

三、主题系统

主题系统是UI Kitten最强大的特性之一。它不仅支持亮色/暗色主题的无缝切换,还允许你创建完全自定义的品牌主题。

3.1 使用内置主题
UI Kitten提供了两套内置主题:

import * as eva from '@eva-design/eva';
import { ApplicationProvider } from '@ui-kitten/components';

// 亮色主题
<ApplicationProvider {...eva} theme={eva.light}>
  {/* 应用内容 */}
</ApplicationProvider>

// 暗色主题
<ApplicationProvider {...eva} theme={eva.dark}>
  {/* 应用内容 */}
</ApplicationProvider>

3.2 运行时动态切换主题
UI Kitten最引人注目的特性之一,是能够在运行时动态切换主题,无需重新加载应用。这对于实现"深色模式"功能至关重要。

实现步骤:

// 1. 创建一个Context来管理当前主题
// ThemeContext.js
import React from 'react';

export const ThemeContext = React.createContext({
  theme: 'light',
  toggleTheme: () => {},
});

// 2. 在App中使用state管理主题
// App.js
import React, { useState } from 'react';
import * as eva from '@eva-design/eva';
import { ApplicationProvider } from '@ui-kitten/components';
import { ThemeContext } from './ThemeContext';
import { AppNavigator } from './navigation/AppNavigator';

export default function App() {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    const nextTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(nextTheme);
  };

  return (
    <ThemeContext.Provider value={
  { theme, toggleTheme }}>
      <ApplicationProvider {...eva} theme={eva[theme]}>
        <AppNavigator />
      </ApplicationProvider>
    </ThemeContext.Provider>
  );
}

// 3. 在任何组件中切换主题
// SettingsScreen.js
import React, { useContext } from 'react';
import { Button } from '@ui-kitten/components';
import { ThemeContext } from './ThemeContext';

export function SettingsScreen() {
  const { theme, toggleTheme } = useContext(ThemeContext);

  return (
    <Button onPress={toggleTheme}>
      切换至{theme === 'light' ? '暗色' : '亮色'}模式
    </Button>
  );
}

运行时主题切换的优势:

无需重新加载应用,体验流畅

所有组件自动适配新主题,无需手动刷新

支持与系统主题设置同步

3.3 创建自定义主题
UI Kitten允许你通过扩展内置主题来创建自定义主题:

// custom-theme.js
import * as eva from '@eva-design/eva';

// 创建自定义亮色主题
export const customLightTheme = {
  ...eva.light,
  'color-primary-500': '#FF6B6B',     // 自定义主色调
  'color-primary-600': '#FF5252',     // 主色调变体
  'color-success-500': '#4ECDC4',     // 自定义成功色
  'color-danger-500': '#FF6B6B',      // 自定义危险色
  'text-basic-color': '#2D3436',      // 基础文字颜色
  'background-basic-color-1': '#FFFFFF', // 背景色
};

// 创建自定义暗色主题
export const customDarkTheme = {
  ...eva.dark,
  'color-primary-500': '#FF6B6B',
  'color-primary-600': '#FF5252',
  'color-success-500': '#4ECDC4',
  'color-danger-500': '#FF6B6B',
  'text-basic-color': '#DFE6E9',
  'background-basic-color-1': '#1E1E1E',
};
// 使用自定义主题
import { customLightTheme, customDarkTheme } from './custom-theme';

<ApplicationProvider {...eva} theme={customLightTheme}>
  {/* 应用内容 */}
</ApplicationProvider>

3.4 Eva设计系统的变量命名规范
Eva Design System的变量命名遵循一致的规范:
image.png
颜色级别(level)从100到900,数值越大颜色越深。500通常代表基础色。

四、核心组件详解

UI Kitten提供了超过25个通用组件。以下是开发中最常用的核心组件及其详细用法。

4.1 布局组
Layout组件
Layout是最基础的容器组件,提供了主题感知的背景色:

import { Layout, Text } from '@ui-kitten/components';

export function HomeScreen() {
  return (
    <Layout style={
  { flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text category="h1">欢迎使用UI Kitten</Text>
    </Layout>
  );
}

Divider组件
分割线组件,用于在视觉上分隔内容:

import { Divider, Text, Layout } from '@ui-kitten/components';

export function SettingsList() {
  return (
    <Layout>
      <Text category="s1">账户设置</Text>
      <Divider style={
  { marginVertical: 8 }} />
      <Text category="s1">隐私设置</Text>
      <Divider style={
  { marginVertical: 8 }} />
      <Text category="s1">通知设置</Text>
    </Layout>
  );
}

4.2 表单组件
Input组件
文本输入框组件,支持多种状态和样式:

import React, { useState } from 'react';
import { Input, Icon } from '@ui-kitten/components';

export function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [secureTextEntry, setSecureTextEntry] = useState(true);

  const EyeIcon = (props) => (
    <Icon {...props} name={secureTextEntry ? 'eye-off' : 'eye'} />
  );

  return (
    <>
      <Input
        placeholder="邮箱"
        value={email}
        onChangeText={setEmail}
        keyboardType="email-address"
        autoCapitalize="none"
        style={
  { marginBottom: 16 }}
      />
      <Input
        placeholder="密码"
        value={password}
        onChangeText={setPassword}
        secureTextEntry={secureTextEntry}
        accessoryRight={(props) => (
          <Icon {...props} name={secureTextEntry ? 'eye-off' : 'eye'} />
        )}
      />
    </>
  );
}

Select组件
下拉选择器组件:

import React, { useState } from 'react';
import { Select, SelectItem } from '@ui-kitten/components';

export function CitySelect() {
  const [selectedIndex, setSelectedIndex] = useState(null);
  const [selectedCity, setSelectedCity] = useState('');

  const cities = ['北京', '上海', '广州', '深圳'];

  return (
    <Select
      placeholder="请选择城市"
      value={selectedCity}
      selectedIndex={selectedIndex}
      onSelect={(index) => {
        setSelectedIndex(index);
        setSelectedCity(cities[index.row]);
      }}
    >
      {cities.map((city, index) => (
        <SelectItem key={index} title={city} />
      ))}
    </Select>
  );
}

4.3 模态框 Modal
Modal组件用于创建弹窗:

import React, { useState } from 'react';
import { Modal, Button, Card, Text } from '@ui-kitten/components';
import { StyleSheet, View } from 'react-native';

export function CustomModal() {
  const [visible, setVisible] = useState(false);

  const styles = StyleSheet.create({
    modal: {
      backgroundColor: 'white',
      borderRadius: 8,
      padding: 16,
      width: '80%',
      maxWidth: 300,
    },
    backdrop: {
      backgroundColor: 'rgba(0, 0, 0, 0.5)',
    },
    buttonContainer: {
      flexDirection: 'row',
      justifyContent: 'flex-end',
      marginTop: 16,
      gap: 8,
    },
  });

  return (
    <>
      <Button onPress={() => setVisible(true)}>打开模态框</Button>
      <Modal
        visible={visible}
        backdropStyle={styles.backdrop}
        onBackdropPress={() => setVisible(false)}
      >
        <View style={styles.modal}>
          <Text category="h6">确认操作</Text>
          <Text style={
  { marginTop: 12 }}>确定要执行此操作吗?</Text>
          <View style={styles.buttonContainer}>
            <Button size="small" appearance="ghost" onPress={() => setVisible(false)}>
              取消
            </Button>
            <Button size="small" onPress={() => setVisible(false)}>
              确定
            </Button>
          </View>
        </View>
      </Modal>
    </>
  );
}

Modal组件关键属性:

visible:控制模态框显示/隐藏

backdropStyle:自定义背景遮罩样式

onBackdropPress:点击背景遮罩时的回调

4.4 导航组件
UI Kitten提供了与React Navigation深度集成的导航组件:

BottomNavigation组件:

import React, { useState } from 'react';
import { BottomNavigation, BottomNavigationTab, Icon } from '@ui-kitten/components';

const PersonIcon = (props) => <Icon {...props} name="person-outline" />;
const BellIcon = (props) => <Icon {...props} name="bell-outline" />;
const SettingsIcon = (props) => <Icon {...props} name="settings-outline" />;

export function AppBottomNavigation({ navigation, state }) {
  return (
    <BottomNavigation
      selectedIndex={state.index}
      onSelect={index => navigation.navigate(state.routeNames[index])}
    >
      <BottomNavigationTab title="个人" icon={PersonIcon} />
      <BottomNavigationTab title="通知" icon={BellIcon} />
      <BottomNavigationTab title="设置" icon={SettingsIcon} />
    </BottomNavigation>
  );
}

TopNavigation组件:

import { TopNavigation, Icon } from '@ui-kitten/components';

const BackIcon = (props) => <Icon {...props} name="arrow-back" />;
const MenuIcon = (props) => <Icon {...props} name="menu-outline" />;

export function CustomTopNavigation({ navigation, title }) {
  return (
    <TopNavigation
      title={title}
      alignment="center"
      accessoryLeft={(props) => <Icon {...props} name="arrow-back" onPress={() => navigation.goBack()} />}
      accessoryRight={(props) => <Icon {...props} name="menu-outline" />}
    />
  );
}

4.5 卡片组件 Card
Card组件用于展示内容块:

import { Card, Text, Button } from '@ui-kitten/components';

export function ProductCard({ product, onPress }) {
  return (
    <Card
      style={
  { marginVertical: 8, marginHorizontal: 16 }}
      onPress={onPress}
    >
      <Text category="h6">{product.name}</Text>
      <Text category="s2" appearance="hint" style={
  { marginTop: 4 }}>
        {product.description}
      </Text>
      <Text category="h6" status="primary" style={
  { marginTop: 12 }}>
        ¥{product.price}
      </Text>
    </Card>
  );
}

来源:
https://xcfsr.cn/

相关文章
|
4月前
|
安全 算法 网络协议
从明文到加密:HTTP与HTTPS核心知识全解析
本文深入解析HTTP与HTTPS的核心差异,揭示HTTPS如何通过SSL/TLS协议、CA证书和混合加密机制,解决HTTP的窃听、篡改与冒充三大安全问题,全面科普网络安全关键技术。
1932 6
|
3月前
|
存储 弹性计算 人工智能
阿里云服务器年付价格表:轻量 / ECS/GPU 2026 最新报价 + 省钱攻略
2026年阿里云服务器价格全汇总:轻量最低38元/年(2核2G+200M带宽),ECS普惠款99元/年起,企业专享199元/年;新老用户同享续费同价、多年付至低3折,覆盖个人建站到企业级高并发全场景。
759 11
|
3月前
|
人工智能 自然语言处理 安全
新手小白如何部署OpenClaw(Clawdbot)?阿里云一键部署!
OpenClaw(原Clawdbot/Moltbot)是一款开源AI智能体平台,可部署于自有服务器,通过自然语言调用浏览器、邮件、文件等工具,自动完成文档整理、日程安排、代码编写等任务,数据本地化,隐私安全可控。
410 11
|
3月前
|
JSON 缓存 API
美客多平台关键词商品搜索API接口实践指南
本文详解美客多(Mercado Libre)关键词商品搜索API的调用方法,涵盖OAuth 2.0认证、请求构建(含分页/排序/过滤)、JSON响应解析、错误处理及最佳实践,助力开发者高效接入拉美最大电商平台的商品数据。(239字)
552 2
|
8月前
|
JSON API 数据格式
亚马逊:调用商品上传API实现全球多站点商品信息一键发布,降低人工操作成本
在亚马逊多站点电商运营中,手动上传商品效率低且易出错。通过调用Selling Partner API,可实现商品信息一键全球发布,大幅提升效率、降低成本。本文详解API功能、数据准备、代码实现与优化策略,助力企业轻松掌握自动化发布流程,提升全球运营能力。
356 0
|
10月前
|
JSON Go 数据处理
Go语言实战案例-读取本地文本文件内容
本案例详细介绍了如何使用 Go 语言读取本地文本文件内容,适合初学者掌握文件输入操作。内容涵盖文件读取的基本方法、错误处理、逐行读取高级用法以及常见问题解决方案,是构建命令行工具和数据处理程序的基础。
echarts中使用散点scatter更改颜色却不生效的问题
本文讨论了在ECharts中使用散点图(scatter)时更改颜色不生效的问题。原因是项目中使用了`visualMap`组件,它具有最高的优先级,导致自定义的颜色设置被覆盖。解决方法是在`visualMap`组件中增加`seriesIndex`属性,指定它只对特定的系列(series)生效,从而避免影响散点图的颜色设置。文章提供了详细的代码示例和解决办法。
563 3
|
存储 运维 监控
监控与日志管理:保障系统稳定运行与高效运维的基石
【8月更文挑战第16天】监控与日志管理是保障系统稳定运行和高效运维的基石。它们不仅能够帮助企业及时发现并解决问题,还能够为性能调优、资源优化和业务决策提供有力支持。因此,在构建系统架构时,企业应高度重视监控与日志管理的规划和实施,确保它们能够充分发挥作用,为企业的发展保驾护航。同时,随着技术的不断进步和应用场景的不断拓展,监控与日志管理也将持续演进和创新,为企业带来更多的价值和便利。
|
前端开发 JavaScript 测试技术
前端 JS 经典:Promise 详解
前端 JS 经典:Promise 详解
485 1
|
监控 安全 物联网
物联网设备间通信协议选择的技术探讨
【7月更文挑战第31天】物联网设备间的通信协议选择是一个复杂而重要的决策过程。通过综合考虑应用场景、设备资源、网络环境、安全性、兼容性以及扩展性等多个因素,我们可以为物联网系统选择最合适的通信协议,从而构建出高效、可靠、安全的物联网生态系统。未来,随着物联网技术的进一步普及和深入应用,我们有理由相信,更多的创新通信协议将不断涌现,为物联网设备间的通信提供更加灵活、高效、安全的解决方案。同时,随着标准化进程的加速推进,不同协议之间的互操作性和兼容性也将得到进一步提升,为物联网系统的集成和扩展提供更加便捷的途径。

热门文章

最新文章