数据绑定
在接触运行时数据绑定 API 之前,重要的是 先熟悉概述中介绍的核心概念。
视图模型
视图模型描述一组属性,但本身不能用于获取或设置值——这是视图模型实例的职责。
首先,我们需要获取对特定视图模型的引用。这可以通过索引、名称或给定画板的默认方式来完成,从 Rive 文件中获取。默认选项指的是编辑器中画板上通过下拉菜单分配的视图模型。
新版运行时(推荐)
import { useRiveFile } from '@rive-app/react-native';
const { riveFile } = useRiveFile(require('./my_file.riv'));
// 按名称获取引用
const namedVM = await riveFile?.viewModelByNameAsync('My View Model');
// 获取所有视图模型名称
const vmNames = await riveFile?.getViewModelNamesAsync(); // ['My View Model', ...]
// 获取默认画板视图模型的引用
const defaultVM = await riveFile?.defaultArtboardViewModelAsync();
旧版运行时
创建视图模型对象仅在新版 React Native 运行时中受支持。
视图模型实例
获取视图模型的引用后,可以使用它来创建实例。创建实例时有四种选择:
- 创建空白实例 — 使用以下默认值填充所创建实例的属性:
| 类型 | 值 |
|---|---|
| Number | 0 |
| String | 空字符串 |
| Boolean | False |
| Color | 0xFF000000 |
| Trigger | 未触发 |
| Enum | 第一个值 |
| Image | 无图像 |
| Artboard | 无画板 |
| List | 空列表 |
| Nested view model | Null |
- 创建默认实例 — 使用编辑器中标记为 "Default" 的实例。通常这是设 计师期望在运行时使用的主要实例。
- 按索引创建 — 使用遍历所有可用实例时的顺序。在通过迭代创建多个实例时很有用。
- 按名称创建 — 使用编辑器中的实例名称。在创建特定实例时很有用。
在一些示例中,由于 "view model instance" 过于冗长,我们使用缩写 "VMI",以及用 "VM" 表示 "view model"。
新版运行时(推荐)
使用 useViewModelInstance hook 创建视图模型实例。您可以传入 RiveFile、ViewModel 或 RiveViewRef 作为来源。
import { useRiveFile, useViewModelInstance, RiveView } from '@rive-app/react-native';
const { riveFile } = useRiveFile(require('./my_file.riv'));
// 从 RiveFile — 默认画板的 ViewModel,默认实例
const { instance } = useViewModelInstance(riveFile);
// 指定画板或 ViewModel 名称(互斥)
const { instance } = useViewModelInstance(riveFile, { artboardName: 'MainArtboard' });
const { instance } = useViewModelInstance(riveFile, { viewModelName: 'Settings' });
// instanceName 可与上述任意选项组合以选择特定实例
const { instance } = useViewModelInstance(riveFile, { instanceName: 'PersonInstance' });
const { instance } = useViewModelInstance(riveFile, { viewModelName: 'Settings', instanceName: 'UserSettings' });
// 从 ViewModel 对象
const viewModel = riveFile?.viewModelByName('My View Model');
const { instance: namedInstance } = useViewModelInstance(viewModel, { name: 'My Instance' });
const { instance: newInstance } = useViewModelInstance(viewModel, { useNew: true });
// 使用 required: true(如果为 null 则抛出异常,需配合 Error Boundary 使用)
const { instance } = useViewModelInstance(riveFile, { required: true });
// 使用 onInit 同步设置初始值
const { instance } = useViewModelInstance(riveFile, {
onInit: (vmi) => {
vmi.numberProperty('health')?.set(100);
},
});
return (
<RiveView file={riveFile} dataBind={instance} />
);
您还可以从 RiveViewRef 获取自动绑定的实例:
import { useRive, useViewModelInstance } from '@rive-app/react-native';
const { riveViewRef, setHybridRef } = useRive();
const { instance } = useViewModelInstance(riveViewRef);
旧版运行时
您可以通过向 Rive 组件传入 dataBinding 属性来将视图模型实例绑定到 Rive 组件。
dataBinding 属性接受 DataBindBy 类型,可以是以下之一:
export type DataBindBy =
| { type: 'autobind'; value: boolean }
| { type: 'index'; value: number }
| { type: 'name'; value: string }
| { type: 'empty' };
export const AutoBind = (value: boolean): DataBindBy => ({
type: 'autobind',
value,
});
export const BindByIndex = (value: number): DataBindBy => ({
type: 'index',
value,
});
export const BindByName = (value: string): DataBindBy => ({
type: 'name',
value,
});
export const BindEmpty = (): DataBindBy => ({ type: 'empty' });
示例用法:
const [setRiveRef, riveRef] = useRive();
return (
<Rive
ref={setRiveRef}
autoplay={true}
dataBinding={AutoBind(true)} // 默认: `AutoBind(false)`
// dataBinding={BindByIndex(0)}
// dataBinding={BindByName('SomeName')}
// dataBinding={BindEmpty()}
stateMachineName={'State Machine 1'}
resourceName={'rewards'}
/>
);
您可以通过向 Rive 组件传入 onError={(riveError: RNRiveError) 属性来监听错误。
riveError 对象包含错误类型和消息,您可以过滤出 RNRiveErrorType.DataBindingError:
onError={(riveError: RNRiveError) => {
switch (riveError.type) {
case RNRiveErrorType.DataBindingError: {
console.error(`${riveError.message}`);
return;
}
default:
console.error('Unhandled error');
return;
}
}}
绑定
创建的实例可以分配给状态机或画板。这会建立在编辑时设置的绑定关系。
建议分配给状态机,因为这会自动将实例也应用到画板上。仅在不使用状态机时(即文件是静态的或使用线性动画时)才分配给画板。
实例的初始值在状态机或画板推进之前不会应用到其绑定的元素上。
新版运行时(推荐)
对于 React Native,不需要额外的步骤来将视图模型实例绑定到 Rive 组件。将实例传递给 RiveView 上的 dataBind 属性:
import { RiveView, useRiveFile, useViewModelInstance } from '@rive-app/react-native';
const { riveFile } = useRiveFile(require('./my_file.riv'));
const { instance } = useViewModelInstance(riveFile);
return (
<RiveView
file={riveFile}
dataBind={instance}
/>
);
旧版运行时
对于 React Native,不需要额外的步骤来将视图模型实例绑定到 Rive 组件。dataBinding 属性会自动处理。
自动绑定
或者,您可能更喜欢使用自动绑定。这将使用默认实例自动将画板的默认视图模型绑定到状态机和画板。默认视图模型是编辑器中画板下拉菜单选择的那个。默认实例是编辑器中标记为 "Default" 的那个。
新版运行时(推荐)
自动绑定通过 DataBindMode 枚举可用。您可以将 DataBindMode.Auto 传递给 dataBind 属性:
import { RiveView, useRiveFile, DataBindMode } from '@rive-app/react-native';
const { riveFile } = useRiveFile(require('./my_file.riv'));
return (
<RiveView
file={riveFile}
dataBind={DataBindMode.Auto}
autoPlay={true}
/>
);
您也可以按名称绑定:
<RiveView
file={riveFile}
dataBind={{ byName: 'My Instance' }}
autoPlay={true}
/>
或绑定特定实例:
const { instance } = useViewModelInstance(riveFile);
<RiveView
file={riveFile}
dataBind={instance}
autoPlay={true}
/>
旧版运行时
dataBinding 属性的默认值是 AutoBind(false),这意味着自动绑定默认禁用。
要启用自动绑定,将 dataBinding 属性设置为 AutoBind(true):
const [setRiveRef, riveRef] = useRive();
return (
<Rive
ref={setRiveRef}
autoplay={true}
dataBinding={AutoBind(true)} // 默认: `AutoBind(false)`
stateMachineName={'State Machine 1'}
resourceName={'rewards'}
/>
);
属性
属性是可以在视图模型实例上读取、设置或观察的值。属性可以是以下类型:
| 类型 | 支持 |
|---|---|
| 浮点数 | ✅ |
| 布尔值 | ✅ |
| 触发器 | ✅ |
| 字符串 | ✅ |
| 枚举 | ✅ |
| 颜色 | ✅ |
| 嵌套视图模型 | ✅ |
| 列表 | ✅ |
| 图像 | ✅ |
| 画板 | ✅ |
有关版本兼容性的更多信息,请参见功能支持页面。