vue3中的toRef、toRefs和toRaw

1.toRef

 toRef 的作用是将一个响应式对象中的属性转换成单独的响应式引用。转换后的响应式引用会跟踪原始属性的变化。转换后的响应式可以被用于计算属性监听器中。

如果原始对象是非响应式的则不会更新视图,数据会改变。

接收两个参数:

  • 参数一:原始对象;
  • 参数二:属性。
<template>
  <div>
    {{ man }}
  </div>
  <br />
  <div>
    <button @click="change">点击</button>
  </div>
</template>

<script setup lang="ts">
import { toRef, toRefs, reactive, toRaw } from 'vue'

const man = reactive({ name: '张三', age: 18, like: '唱' })
const like = toRef(man, 'like')
const change = () => {
  man.age = 19
  like.value = '跳'
  console.log(man)
}
</script>

点击前页面:

点击后结果:

2.toRefs

 toRefs 将一个对象的所有属性变成响应式引用,追踪原对象的引用关系。

原始对象如果是响应式的,则当修改属性值时,数据和视图都会更新;原对象如果非响应式,则修改属性值时,数据会更新,视图不更新。

接收一个参数:原始对象。

<template>
  <div>
    {{ man }}
  </div>
  <br />
  <div>
    <button @click="change2">点击2</button>
  </div>
</template>

<script setup lang="ts">
import { toRef, toRefs, reactive, toRaw } from 'vue'

const man = reactive({ name: '张三', age: 18, like: '唱' })
const { name, age } = toRefs(man)
const change2 = () => {
  name.value = '李四'
  age.value = 20
}
</script>

<style scoped></style>

 点击前页面:

点击后结果:

3.toRaw

 toRaw 将一个响应式对象变成非响应式。修改属性值时,数据会改变,视图不会更新。

接受一个参数:原始对象。 

<template>
  <div>
    {{ man }}
  </div>
  <br />
  <div>
    <button @click="change3">点击3</button>
  </div>
</template>

<script setup lang="ts">
import { toRef, toRefs, reactive, toRaw } from 'vue'

const man = reactive({ name: '张三', age: 18, like: '唱' })
const change3 = () => {
  // 手写toRaw
  console.log(man['__v_raw'])
  // 调用toRaw
  console.log(toRaw(man))
}
</script>

 点击前与点击后页面:

点击后结果:

这是一个比较复杂的问题,需要使用Java的3D图形库来实现。以下是一个简单的示例代码,可以实现一个旋转的魔方模型: ```java import javax.media.j3d.*; import javax.vecmath.*; public class RubiksCube extends Shape3D { private static final int NUM_FACES = 6; private static final int NUM_CUBES_PER_SIDE = 3; private static final float CUBE_SIZE = 0.5f; private static final float FACE_SIZE = CUBE_SIZE * NUM_CUBES_PER_SIDE; private Transform3D rotationTransform; public RubiksCube() { // 创建一个立方体数组,表示魔方的所有小立方体 Box[][][] cubes = new Box[NUM_CUBES_PER_SIDE][NUM_CUBES_PER_SIDE][NUM_CUBES_PER_SIDE]; // 创建每个小立方体并将其添加到数组中 for (int i = 0; i < NUM_CUBES_PER_SIDE; i++) { for (int j = 0; j < NUM_CUBES_PER_SIDE; j++) { for (int k = 0; k < NUM_CUBES_PER_SIDE; k++) { Vector3f translation = new Vector3f( (i - 1) * CUBE_SIZE, (j - 1) * CUBE_SIZE, (k - 1) * CUBE_SIZE); cubes[i][j][k] = new Box(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE, createAppearance()); Transform3D translationTransform = new Transform3D(); translationTransform.setTranslation(translation); TransformGroup cubeTransformGroup = new TransformGroup(); cubeTransformGroup.setTransform(translationTransform); cubeTransformGroup.addChild(cubes[i][j][k]); addChild(cubeTransformGroup); } } } // 创建旋转变换 rotationTransform = new Transform3D(); rotationTransform.rotY(Math.PI / 4.0); } // 创建外观 private Appearance createAppearance() { Appearance appearance = new Appearance(); // 设置材质属性 Material material = new Material(); material.setDiffuseColor(1.0f, 1.0f, 1.0f); material.setShininess(64.0f); appearance.setMaterial(material); return appearance; } // 旋转魔方 public void rotate() { Transform3D currentTransform = new Transform3D(); getTransform(currentTransform); currentTransform.mul(rotationTransform); setTransform(currentTransform); } } ``` 这个代码创建了一个 `RubiksCube` 类,它继承自 `Shape3D`。它包含了一个立方体数组,每个小立方体都是一个 `Box` 实例,它们被组合成一个完整的魔方模型。 在构造函数中,我们创建了每个小立方体,并将它们添加到立方体数组中。然后我们将每个小立方体包装在一个 `TransformGroup` 中,这样我们可以对整个魔方模型进行变换。 最后,我们创建了一个旋转变换 `rotationTransform`,并在 `rotate()` 方法中应用它,以旋转整个魔方模型。你可以在你的程序中使用这个类来创建一个3D的旋转鸡块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛扇赵四那半好嘴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值