Skip to content

RW

RW方法可以为目标对象创建一个代理,用于开启功能更强大的读写模式。我一般称它为高级读写领域。 在这个领域下,你可以调用我内置的一些读写语法。甚至,你还可以借助这个领域扩展出符合自己需求和喜好的语法。

特性

键名即引用
  属性名可以从#开始,这时使用引用执行本次读写,每层属性名之间使用/分隔
空指针预防措施
  在引用中过程中,非末尾属性为undefinednull时,不会去抛出空指针异常, 而是会自动创建一个空容器,默认创建对象。但如果属性拥有$Array_修饰符,则创建数组。
修饰词钩子
  在引用中过程中,属性名可以增加$[内置关键词]_前缀修饰。 修饰词在语义上代表属性内的特征,在执行上则包含了一系列数据处理。

尝试一下

语法

javascript
RW(target)['#/value']
RW(target)['#/$JSON_jsonStr/value']

RW(target)['#/$Array_arr/0/value']
RW(target)['#/$Array_arr/0'].value
RW(target)['#/$Array_arr/0']['#/value']

RW(target)['#/$Array_arr/$Item_value']
RW(target)['#/$Array_arr/$ItemString_value']

参数

target

  需要创建代理的目标对象。

返回值

Proxy<object>

RW()将返回一个Proxy代理,并且这个代理每次取值也会返回一个新的RW代理。

示例

解决了 ?.语法 不能被赋值的问题 常规方式

vue
<template>
  <table>
    <tr v-for="r_item in row">
      <td v-for="cell in r_item">{{cell.value}}</td>
    </tr>
  </table>
  <FormCell v-if="currentNode.children[0].props" v-model="currentNode.children[0].props.preset"></FormCell>
</template>
<script setup>

</script>

使用RW

vue
<FormCell v-model="RW(currentNode)['#/children/0/props/preset']"></FormCell>

解决了数据初始化繁琐的问题

vue

兼容性

由于使用Proxy对象,不支持IE浏览器,详细浏览器兼容性参考MDN Proxy 浏览器兼容性

vue3环境下

RW()代理本身无法在vue3中被深度监听,你需要尽量避免监听代理的情况。

如果必须,你可以尝试使用shallowRW()

参考

引用方式参考了JSON Schema 规范中使用$ref引用的部分。

函数设计参考了Excel常用函数