所有问题

汇总常见技术疑问、解决思路和实践经验。

问题答案 12026年5月29日 00:04

如何让MobX Decorators与Create-React-App v2配合使用?

在Create-React-App v2(简称CRA v2)中使用MobX Decorators需要配置项目以支持装饰器语法。CRA默认不支持装饰器,因此我们需要通过一些方式来修改配置文件,一般有两种方法:使用 和 或者手动配置Babel。使用react-app-rewired和customize-cra步骤一:安装必要的依赖首先,你需要安装 和 ,这两个库可以帮助我们在不eject CRA的情况下修改webpack和Babel配置。步骤二:修改package.json然后,更改 中的scripts部分,使用 来启动、构建和测试项目。步骤三:创建配置文件在项目根目录下创建一个名为 的文件,用来配置装饰器支持。此代码通过 启用传统装饰器支持。手动配置Babel如果你不想使用 ,你可以选择手动弹出CRA的配置。步骤一:弹出配置这将创建 和 文件夹,你可以在这里找到Babel的配置文件。步骤二:修改Babel配置在Babel配置文件(通常位于 或 中),添加装饰器插件:确保你已经安装了这个插件:结论使用 和 是配置CRA以支持装饰器的推荐方法,因为它不需要你弹出CRA的配置,从而更容易维护。不过,如果项目需要更复杂的定制,eject方法也是一个可选方案。使用上述任一方法后,你就可以在CRA项目中使用MobX装饰器来管理你的应用状态了。
问题答案 12026年5月29日 00:04

如何允许null,但禁止undefined?

在JavaScript编程中,和都可以表示缺乏值,但它们的用途和含义有所不同。通常用于表示程序员已经定义了变量,但它目前没有值。而通常表示变量已声明但未初始化。如果我们想要在代码中允许但禁止,我们可以通过几种方法来实现:1. 类型检查示例:2. 使用TypeScript在使用TypeScript时,我们可以设置严格的类型检查来明确区分和。TypeScript 配置:在中启用:TypeScript 示例:3. 默认参数值在函数参数中使用默认值可以防止值,但允许。示例:在上述示例中,当作为参数传递时,它会被默认参数值替代,而则不会被替代。总结通过这些方法,我们可以在JavaScript或TypeScript项目中有意识地选择允许但禁止的策略,这有助于提高代码的清晰性和健壮性。使用适当的错误处理和类型检查可以确保程序的稳定性,并减少潜在的bug。
问题答案 12026年5月29日 00:04

如何在sessionStorage中保存Mobx状态

要在sessionStorage中保存Mobx状态,我们可以利用Mobx提供的反应式机制和浏览器的sessionStorage API。这样既可以利用Mobx管理状态的便利,又能够在用户关闭浏览器标签后删除这些数据,因为sessionStorage的存储周期仅限于页面会话。 步骤和示例代码:第一步:创建Mobx Store首先,我们需要有一个Mobx store,这里提供一个简单的例子:第二步:监听Store变化,并更新sessionStorage我们可以使用 函数从 库中来自动监听任何可能影响到的变化,并更新sessionStorage。这样每当store中的数据发生变化时,我们都会同步更新sessionStorage。这段代码会监视 中的 对象。每当 发生变化时,都会自动将更新后的 序列化为JSON字符串,并存储在sessionStorage中。第三步:从sessionStorage恢复状态(如果有必要)当用户重新打开页面时,我们可以在应用加载时检查sessionStorage中是否有先前保存的状态,并据此初始化store。这段代码尝试从sessionStorage获取 。如果存在,它会解析JSON字符串,然后使用解析后的数据来设置store的状态。总结:通过这种方式,我们可以确保Mobx的状态在页面会话期间保持一致,并在用户关闭浏览器标签后自动清除。这种方法既简单又有效,能够让状态管理与持久化结合得更加紧密。
问题答案 12026年5月29日 00:04

如何使用Ant Design制作响应式网格?

在Ant Design中,我们可以使用和组件来创建响应式的网格系统。Ant Design的栅格系统基于24栅格原则,允许我们在不同的屏幕尺寸上实现不同的布局响应。以下是一个如何使用这些组件来制作一个简单响应式网格的步骤和示例:1. 导入所需的组件首先,我们需要从库中导入和组件:2. 创建基本的Row和Col结构接下来,我们创建基本的行和列结构。假设我们要创建一个三列的布局:这里每个组件设置了,这意味着每列占据8/24的空间,即三分之一的行宽。3. 添加响应式布局为了使网格在不同设备尺寸下响应,我们可以在组件中使用, , , , 等属性来定义不同断点下的布局:在这个例子中:表示在超小屏幕(手机)上,每列占满整行。表示在小屏幕(平板)上,每列占一半的行宽。, , 分别表示在中屏、大屏、超大屏上的布局方式。4. 调整间距使用的属性可以设置列与列之间的间距,以上代码表示每个之间有16px的间距。示例应用假设我们要为一个产品展示页面创建一个响应式的网格布局,每个产品卡片根据屏幕大小调整其显示的列数:在这个例子中,每个产品卡片在不同的屏幕尺寸下占据不同的列宽,从而创建一个整洁且响应式的布局。
问题答案 12026年5月29日 00:04

如何减少antd表单项之间的间距?

在使用Ant Design(简称antd)的表单组件时,我们可以通过多种方式来调整表单项之间的间距。下面我将分享一些常见的方法:1. 使用CSS样式调整最直接的方式是通过CSS来调整表单项(Form.Item)的样式。例如,我们可以减少margin或者padding来减少表单项之间的间距。示例代码:2. 使用Row和Col布局控制使用 和 组件来控制表单项的布局。我们可以通过调整 属性来控制列与列之间的间距。示例代码:3. 全局配置或主题修改如果是一个大型项目,而我们需要在项目范围内统一调整表单项的间距,可以考虑修改Ant Design的主题变量。Ant Design支持通过配置 变量来全局调整样式。比如,可以调整 变量来修改Form.Item的默认margin。示例配置:4. Form的layout属性Ant Design的Form组件支持属性,这个属性可以是或。如果是垂直布局(),可能默认的间距会比水平布局()小,可以考虑根据需要选择合适的布局。示例代码:通过上述方法,我们可以有效地调整antd表单项之间的间距,使界面更加紧凑和美观。具体选择哪种方法,可以根据项目的具体需求和现有的代码基础来决定。
问题答案 12026年5月29日 00:04

如何使用Ant Design将输入数限制为最大两位小数?

在使用Ant Design的组件时,我们可以通过使用和属性来限制用户输入的数字最多只有两位小数。属性允许我们定义如何显示数值,而属性则定义如何从显示的值中提取数值。步骤导入组件:首先,确保你已经有了Ant Design库,并且在你的文件中导入了。设置和属性:属性用于定义输出的显示格式。这里我们使用JavaScript的模板字符串来添加必要的格式。属性则用于从格式化的字符串中提取数值,通常与相反。在这个例子中:Formatter::这段正则表达式用来移除所有非数字字符,除了小数点。:这段正则确保数字最多只有两位小数。Parser::这段正则表达式用于去除可能因格式化而产生的货币符号和逗号。测试:在实际项目中,你应该在本地或开发环境中测试这个组件,确保它按预期工作,特别是在处理各种类型的输入时。示例代码下面是一个完整的例子,展示了如何在React组件中使用这个设定:在这个例子中,我们也设定了和属性以限制用户可输入的最小和最大值,并设置了属性定义每次增减的步长。这样我们就创建了一个用户体验良好且功能全面的小数输入组件。
问题答案 12026年5月29日 00:04

油猴脚本中用户脚本中的@include和@match有什么区别?

在用户脚本(如Tampermonkey或Greasemonkey脚本)中,和都是元数据块(Metadata Block)中用来指定脚本应当在哪些网页上运行的关键指令。虽然它们的功能相似,但是它们的匹配模式和精确度有所不同。@include指令允许使用通配符来定义脚本应当运行的页面。这种方式提供了较大的灵活性,但相对来说,可能会因匹配过宽泛而导致脚本在不应运行的页面上运行。例子:在这个例子中,脚本将会在所有使用协议访问域名下的页面上运行,无论路径是什么。@match与相比,提供了更为精确的URL匹配模式。它不支持通配符,但可以使用特定的URL模式匹配语法来精确定义脚本应运行的页面。例子:在此例中,同样指示脚本在访问的页面上运行,但它使用的是更为标准化的模式匹配方式,更便于控制和避免误匹配。总结总的来说,提供了更高的灵活性,适用于那些需要广泛匹配的场景,而则提供了更高的精确性和标准化,适合需要精确控制脚本运行环境的场景。选择哪一种取决于具体的应用需求和对匹配控制的需求程度。在实际使用中,有些开发者会结合使用这两种指令,以利用各自的优点。
问题答案 12026年5月29日 00:04

如何隐藏antd Modal的“确定”和“取消”按钮?

在使用Ant Design的Modal组件时,如果您希望隐藏默认的“确定”和“取消”按钮,可以通过设置属性为来实现。这样做可以完全移除Modal底部的按钮区域,使其不显示任何内容。示例代码下面是如何使用属性隐藏按钮的一个例子:在这个例子中,当用户点击“Open Modal”按钮时,会弹出一个Modal对话框,但是没有显示底部的“确定”和“取消”按钮,因为我们将属性设置为了。自定义底部内容如果您仍希望在Modal底部显示一些内容,但不使用默认按钮,可以传递自定义React元素给属性。例如:这段代码会替换默认的按钮为"Return"和"Submit"按钮,提供了更多的自定义性和灵活性。
问题答案 12026年5月29日 00:04

如何用typescript接口描述mobx状态树模型?

TypeScript接口用于描述MobX状态树模型在使用MobX状态树(MobX-State-Tree, MST)时,TypeScript的接口可以帮助定义模型的结构和类型,确保模型的使用符合预期的类型规范。以下是一步步的过程和示例:1. 定义基本接口首先,定义一个接口来表示模型中每个项目或实体的结构。例如,如果我们有一个代表“用户”(User)的模型,我们可以这样定义:2. 使用创建MobX状态树模型在MobX状态树中,使用来创建模型,并使用TypeScript的接口作为类型注释,以确保模型的属性与接口定义匹配:在这里,我们没有直接使用接口来定义模型的类型,因为MST提供了一套自己的类型系统。不过,我们确保的定义与接口一致。3. 实现接口与模型的校验虽然TypeScript的接口不能直接用在中进行类型检查,我们可以通过其他方式来确保我们的MST模型符合TypeScript的类型接口。一个常用的方法是编写一个函数,该函数接受一个类型的参数,并返回一个实例:这个函数的存在确保只有符合接口的对象才能用来创建的实例,从而在运行时和编写时都提供类型安全。4. 使用TypeScript的工具提升开发体验TypeScript提供了强大的类型推断和校验功能,可以通过一些工具和技巧来使得与MST更好地集成。例如,使用类型守卫(type guards)来判断某个变量是否符合接口:这个类型守卫允许TypeScript在条件语句中更智能地推断类型:总结在使用MobX状态树与TypeScript时,虽然不能直接在中使用TypeScript的接口,但可以通过确保MST模型的结构与TypeScript接口一致,以及使用辅助函数和类型守卫来加强类型的正确性和安全性。这样可以充分利用TypeScript提供的静态类型检查功能,提高代码质量和可维护性。
问题答案 12026年5月29日 00:04

如何使 Ant design 抽屉组件宽度自适应

在使用 Ant Design 的抽屉(Drawer)组件时,我们希望它的宽度可以根据视窗(viewport)的大小动态变化,以提供更好的响应式用户体验。要实现这个功能,我们可以结合使用 CSS 媒体查询和 React 的状态管理。步骤 1: 设置抽屉组件的基本宽度首先,我们需要在 React 组件中设置一个基本的宽度状态,这个宽度将作为抽屉组件的初始宽度。步骤 2: 使用媒体查询动态调整宽度接下来,我们可以使用 或者 CSS 中的 查询来侦听视窗大小的变化,并根据不同的屏幕尺寸调整抽屉的宽度。解释在上述示例中,我们首先通过 useState Hook 设置了一个 状态来存储当前抽屉的宽度。然后,我们使用 useEffect Hook 来添加一个监听浏览器窗口大小变化的事件处理器。每当窗口大小发生变化时,我们会根据当前的窗口宽度来调整抽屉的宽度,以适应不同的设备。通过这种方式,无论用户是在手机、平板还是大屏幕设备上浏览你的网站,抽屉组件都能提供适合的用户体验。
问题答案 12026年5月29日 00:04

如何在Ant设计上传组件中设置customRequest以使用XMLHttpRequest?

在使用Ant Design的Upload组件时,如果需要自定义上传行为,比如使用来代替默认的上传方式,我们可以通过设置Upload组件的属性来实现。这个属性允许我们覆盖内部的上传逻辑。以下是一个使用属性来实现上传功能的例子,其中使用了进行文件上传:在这个例子中,我们定义了函数,该函数接收一个对象参数,包含了文件对象、成功回调、错误回调以及进度回调。我们创建一个,并设置其上传进度事件,加载完成事件和错误事件的处理函数。最后,我们创建一个实例,将文件添加到中,然后通过发送这个到服务器。通过这样的设置,我们可以完全控制上传的过程,包括处理进度、成功和失败的逻辑。这在需要对上传过程进行特别定制时非常有用,例如添加额外的安全措施,或者使用不同的请求参数或头部等。
问题答案 12026年5月29日 00:04

如何在Redux中使用类模型(带有Mobx选项)

首先是如何在Redux中使用类模型,其次是如何利用MobX作为一个替代方案或补充方案。1. 在Redux中使用类模型Redux通常用于管理应用程序的状态,并且其设计理念和使用方式倾向于使用纯函数和不可变数据。Redux的核心是一个单一的store,其中包含整个应用程序的状态,状态更新是通过发送action并通过reducer函数处理来实现的。实现方式:在Redux中使用类模型并不常见,因为Redux官方推荐使用不可变数据,但是如果需要在Redux中使用类模型,可以按以下方式进行:定义类: 可以定义一个类来封装数据和方法。例如,如果我们有一个用户管理的应用,我们可以定义一个 类。在Action中使用: 当我们需要更新状态时,可以创建一个实例并将其作为action的一部分传递。在Reducer中处理: 在reducer中,我们可以接受这个action并处理对应的类实例。2. 利用MobX作为选项MobX是另一种流行的状态管理库,它使用更加面向对象的方式来管理状态。MobX允许使用可变数据,并通过观察这些数据的变化来自动更新UI。实现方式:使用MobX时,通常会使用类来定义状态和操作状态的方法。定义可观察类: 使用 装饰器来标记状态字段,使用 装饰器来标记改变状态的方法。在React组件中使用: 利用 从 包中将React组件转换为响应式组件,这样状态更新时可以自动重新渲染组件。结论在Redux中使用类模型可能需要一些额外的考虑,特别是关于不可变性的处理。而MobX提供了一个更自然的方式来使用面向对象的编程风格管理状态,特别是在需要管理复杂状态逻辑和多个相关状态时。如果团队倾向于函数式编程,Redux可能是更好的选择;如果团队更习惯于面向对象的风格,MobX可能会更适合。
问题答案 12026年5月29日 00:04

当Ant Design中的pageSize发生变化时,如何重置分页的当前页面?

在使用Ant Design的分页组件时,当(每页显示的条目数)发生变化时,通常需要重置分页的当前页面到第一页,以避免出现用户界面不一致或数据显示错误的问题。要实现这一功能,可以通过更新组件的状态来手动设置分页器回到第一页。以下是一个具体的实现示例,使用React框架和Ant Design的组件:在这个例子中:我们定义了和两个状态,分别用于控制当前的页码和每页显示的条目数。使用了组件的和事件处理函数。当页码改变时触发,而当页面大小改变时触发。在函数中,我们除了更新,还将设置为1,这样用户在改变每页显示条目数后,视图会自动跳转到第一页。这种做法确保了用户界面的一致性和数据的准确性,同时提升了用户体验。
问题答案 12026年5月29日 00:04

如何在Nested DTO-NestJS中实现条件验证?

在NestJS中实现Nested DTO的条件验证通常涉及到使用库来进行数据验证。提供了一系列的装饰器,可以帮助我们实现复杂的验证逻辑。对于条件验证,我们可以使用装饰器来实现特定条件下的数据验证。以下是如何在Nested DTO中使用来实现条件验证的步骤:步骤 1: 创建Nested DTO首先,我们需要定义我们的DTO(Data Transfer Object)。假设我们有一个对象和一个对象,其中包含多个。步骤 2: 使用装饰器在上面的例子中,类有一个布尔属性和一个属性。我们只在订单是礼物(为true)的情况下需要验证。通过使用装饰器,我们可以设定条件:仅当为true时,才检查的值是否是整数。步骤 3: 在服务中使用DTO在你的NestJS服务中,你可以使用这些DTO来处理和验证来自客户端的数据:在这个控制器中,任何发送到的请求体都将自动验证其结构是否符合类的定义,包括条件验证。总结这样,我们就能根据条件验证Nested DTO中的属性了。在实际开发中,这种方法极大地提高了代码的可维护性和数据的一致性。通过的使用,我们可以轻松地实现复杂的验证逻辑,确保我们的应用程序可以正确地处理各种输入情况。
问题答案 12026年5月29日 00:04

如何在antd中获取FormItem更改时的字段值

在使用Ant Design(antd)库中的表单组件(如 和 )时,我们经常需要获取表单项(FormItem)更改时的字段值以进行一些操作或验证。Ant Design 提供了多种方式来实现这一功能,以下是一些常见的方法:1. 使用 和 回调Ant Design 的 组件提供了 和 两个钩子函数,它们可以用于捕获字段的变化。onValuesChange这个回调函数会在表单字段值发生变化时触发,参数中包含了所有表单的值。在上面的例子中,每当任何表单字段值发生变化时, 函数都会被调用,它会打印出变化的字段值和所有字段的当前值。onFieldsChange这个回调函数会提供更详细的信息,包括字段的状态和名称。在这个例子中,每当表单字段的任何属性(如值、触摸状态、验证状态)发生变化时, 函数将被调用。2. 使用 的如果你只关心特定表单项的值变化,可以使用 的 属性来处理这种情况。这个属性可以让你自定义处理表单控件的值:上述代码中,我们通过 对输入值进行了处理,例如去除字符串的前后空格。这样,无论何时表单项的值发生变化,我们都可以获取到处理后的值。通过上述方法,你可以根据需要灵活地获取并处理 Ant Design 表单中的字段值变化。这对于创建动态的、响应用户输入的界面非常有帮助。
问题答案 12026年5月29日 00:04

如何在Ant Design React Form中禁用字段?

在Ant Design的React Form组件中,禁用字段是一个常见的需求。可以通过设置属性来实现。以下是一个具体的步骤说明和示例:步骤说明使用Form.Item:首先,确保你的输入组件(如Input, DatePicker等)被包含在一个中。设置disabled属性:在你的输入组件上设置属性。这个属性接受一个布尔值,代表禁用,代表启用。示例代码假设我们有一个表单,其中包含一个文本输入框和一个日期选择器。我们想要禁用文本输入框,但保持日期选择器启用。代码如下:解释在上述例子中:用户名字段:我们设置了。表明这个输入框是禁用的,用户不能在其中输入数据。注册日期字段:DatePicker组件使用,这意味着用户可以正常使用日期选择器。这样,你可以根据需求灵活地启用或禁用表单中的任何字段。使用属性是控制字段输入状态的一种简单有效的方式。
问题答案 12026年5月29日 00:04

如何在WordPress PHP文件中编写短代码?

在WordPress中使用短代码可以让用户轻松地在文章、页面或小部件中插入自定义内容或功能。以下是如何在WordPress PHP文件中编写和使用短代码的步骤:步骤 1: 定义短代码函数首先,您需要在您的主题的 文件或自定义插件中定义一个处理短代码的函数。这个函数将包含您希望短代码执行的功能。假设我们要创建一个显示当前日期的简单短代码:步骤 2: 注册短代码接下来,您需要使用 函数来注册短代码,将短代码的标签和处理函数关联起来。在这个例子中,'currentdate' 是短代码的标签,而 'showcurrent_date' 是当这个短代码被调用时执行的函数。步骤 3: 在内容中使用短代码注册短代码后,您可以在WordPress的任何文章、页面或文本小部件中使用它。只需添加以下短代码:当WordPress渲染页面时,它会自动调用 函数,将 替换成当前日期。案例示例假设我们需要创建一个更复杂的短代码,比如显示特定用户的信息。我们首先需要定义处理这个短代码的函数:然后注册这个短代码:现在,在任何文章或页面中,您可以这样使用此短代码:这将显示ID为2的用户的用户名和邮箱。通过这种方法,您可以灵活地在WordPress中添加各种自定义功能,只需要简单地插入一个小的短代码标签。
问题答案 12026年5月29日 00:04

WordPress中最常用的功能是什么?

在WordPress中,一些最常用且强大的功能包括:主题和插件系统:WordPress拥有一个庞大的主题和插件库,使用户可以轻松地扩展和定制他们的网站。主题负责网站的外观和布局,而插件则添加额外的功能。例如,WooCommerce插件能将普通的网站转变为全功能的电子商务平台。可视化编辑器(Gutenberg):WordPress的Gutenberg编辑器是一个块状编辑器,它允许用户通过简单的拖放操作来构建内容。这使得创建复杂的布局变得简单,而无需编写代码。例如,用户可以轻松添加图片、视频、按钮或分隔符。SEO友好:WordPress天生支持搜索引擎优化(SEO)。它生成的代码符合SEO最佳实践,网站结构清晰,易于搜索引擎抓取。此外,有许多插件如Yoast SEO可以进一步优化网站,改善搜索引擎排名。响应式设计:多数WordPress主题是响应式的,意味着它们可以自动调整布局来适配不同大小的屏幕,从手机到大屏幕显示器。这对于现代网站非常重要,因为越来越多的用户通过移动设备访问网站。多用户和角色管理系统:WordPress支持多用户登录,并可以为不同的用户分配不同的角色和权限。例如,管理员可以管理整个站点,编辑者可以发布和管理文章,而作者只能写作和发布自己的文章。定期更新和社区支持:WordPress定期更新其核心软件,不仅增加新功能,还改善安全性。WordPress拥有一个庞大且活跃的社区,用户可以从中获得技术支持、插件、主题和最佳实践建议。以上这些功能使WordPress成为了一个极具灵活性和扩展性的平台,适合构建从简单的个人博客到复杂的企业网站。
问题答案 12026年5月29日 00:04

如何在validationif装饰器nestjs类验证器中使用else条件?

在NestJS的类验证器(class-validator)中, 装饰器通常用来在某些条件下应用验证规则。如果需要在某条件不满足时应用其他验证规则(即所谓的“else”条件),我们通常需要使用另一个来指定这个条件的反向逻辑。以下是一个简单的例子来说明这一点:假设我们有一个用户注册的功能,其中用户需要提供或中的至少一个,我们将使用来确保如果未提供,则必须有效,反之亦然。在这个例子中:第一个装饰器检查是否未被提供,如果未提供,那么字段必须符合邮箱格式。第二个装饰器检查是否未被提供,如果未提供,那么字段必须是一个有效的手机号。这样,我们就间接实现了“如果…则…否则…”的逻辑,确保了用户至少提供了其中一个联系方式,并且所提供的信息是有效的。这种方法在处理复杂的条件验证逻辑时非常有用,能够灵活地对数据进行校验。
问题答案 12026年5月29日 00:04

在mobx中何时使用计算值/可观测值

在 MobX 中,合理选择使用计算值(computed values)和可观测值(observables)对于优化你的应用性能和确保响应式系统的正确性至关重要。我将分别说明它们的使用场景,并给出相应的例子:可观测值(Observables)可观测值是 MobX 中的基本概念,用于追踪应用状态的变化。你应该将那些你想要在 UI 或其他计算中作为依赖的状态定义为 observable。这些状态可以是简单数据类型,如字符串和数字,也可以是复杂数据类型,如对象、数组和映射。使用场景举例:假设你正在开发一个待办事项应用,用户可以添加、删除和标记待办事项。在这种情况下,待办事项列表应该是一个 observable,因为 UI 需要在待办事项列表的内容发生变化时更新显示。计算值(Computed Values)计算值用于根据现有的 observables 自动派生一些值。当依赖的 observable 值变化时,computed values 会自动重新计算。使用计算值可以帮助你避免不必要的计算,并保持数据的一致性。使用场景举例:继续以待办事项应用为例,假设你需要在 UI 中显示未完成的待办事项数量。这个值可以从 todos observable 派生得到,因此它应该定义为一个 computed value。在这个例子中, 是一个计算值,它依赖于 这个 observable。每当 发生变化时, 会自动更新,这样确保了 UI 中显示的未完成待办事项数量总是最新的。总结使用可观测值:当你有一些应用状态,这些状态的变化需要被追踪并触发 UI 更新或其他副作用时。使用计算值:当你需要从现有的 observables 派生或计算出新的值,并且希望这个值能够自动更新以反映依赖数据的变化时。正确地使用 observables 和 computed values 不仅可以使你的应用更加高效,还能使代码更清晰、更容易维护。