前端组件库——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/

相关文章
|
18天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34831 46
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
12天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
11669 36
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
7天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2432 25
|
30天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45744 157
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
5天前
|
人工智能 弹性计算 安全
Hermes Agent是什么?怎么部署?超详细实操教程
Hermes Agent 是 Nous Research 于2026年2月开源的自进化AI智能体,支持跨会话持久记忆、自动提炼可复用技能、多平台接入与200+模型切换,真正实现“越用越懂你”。MIT协议,部署灵活,隐私可控。
1681 3
|
12天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
1810 6

热门文章

最新文章

下一篇
开通oss服务