ref/reactive数据类型的特点:

每次修改都会被追踪, 都会更新UI界面, 但是这样其实是非常消耗性能的 所以如果我们有一些操作不需要追踪, 不需要更新UI界面, 那么这个时候, 我们就可以通过toRaw方法拿到它的原始数据, 对原始数据进行修改 这样就不会被追踪, 这样就不会更新UI界面, 这样性能就好了

toRaw

作用:

  1. 做一些不想被监听的事情(提升性能)
  1. setup(){
  2. let obj = {
  3. msg: 'hello',
  4. student: {
  5. name: 'xiaoliu',
  6. age: 20
  7. }
  8. }
  9. let reactiveObj = reactive(obj)
  10. let state = toRaw(reactiveObj)
  11. return {state}
  12. }

vue3——toRaw & markRaw - 图1
上图是进行reactive后的Proxy对象,看看对其toRaw后,
vue3——toRaw & markRaw - 图2
toRaw后,Proxy对象又被转换回去了。
toRaw就通过Proxy把target给提取出来。

reactive中的toRaw

  1. <template>
  2. <div>
  3. <p>{{state}}</p>
  4. <button @click="myFn">按钮</button>
  5. </div>
  6. </template>
  7. <script>
  8. /*
  9. 1.toRaw
  10. 从Reactive 或 Ref中得到原始数据
  11. 2.toRaw作用
  12. 做一些不想被监听的事情(提升性能)
  13. * */
  14. import {reactive, toRaw} from 'vue';
  15. export default {
  16. name: 'App',
  17. setup() {
  18. /*
  19. ref/reactive数据类型的特点:
  20. 每次修改都会被追踪, 都会更新UI界面, 但是这样其实是非常消耗性能的
  21. 所以如果我们有一些操作不需要追踪, 不需要更新UI界面, 那么这个时候,
  22. 我们就可以通过toRaw方法拿到它的原始数据, 对原始数据进行修改
  23. 这样就不会被追踪, 这样就不会更新UI界面, 这样性能就好了
  24. * */
  25. let state = reactive(
  26. {name:'lnj', age:18}
  27. );
  28. // 获取state的源数据
  29. let obj2 = toRaw(state);
  30. // console.log({name:'lnj', age:18} === obj2); // true
  31. // console.log({name:'lnj', age:18} === state); // false
  32. function myFn() {
  33. // 获取的源数据更改,不会触发页面更新
  34. obj2.name = 'zs';
  35. console.log(obj2); // {name: "zs", age: 18}
  36. // state.name = 'zs';
  37. // console.log(state);// {name: "zs", age: 18}
  38. }
  39. return {state, myFn}
  40. }
  41. }
  42. </script>
  43. <style>
  44. </style>

ref中的toRaw

  1. <template>
  2. <div>
  3. <p>{{state}}</p>
  4. <button @click="myFn">按钮</button>
  5. </div>
  6. </template>
  7. <script>
  8. import { toRaw, ref} from 'vue';
  9. export default {
  10. name: 'App',
  11. setup() {
  12. /*
  13. 1.ref本质: reactive
  14. ref(obj) -> reactive({value: obj})
  15. * */
  16. let state = ref({name:'lnj', age:18});
  17. // 注意点: 如果想通过toRaw拿到ref类型的原始数据(创建时传入的那个数据)
  18. // 那么就必须明确的告诉toRaw方法, 要获取的是.value的值
  19. // 因为经过Vue处理之后, .value中保存的才是当初创建时传入的那个原始数据
  20. // let obj2 = toRaw(state);
  21. let obj2 = toRaw(state.value);
  22. console.log(state);
  23. console.log(obj2);
  24. function myFn() {
  25. // 获取的源数据更改,不会触发页面更新
  26. obj2.name = 'zs';
  27. console.log(obj2); // {name: "zs", age: 18}
  28. // state.name = 'zs';
  29. // console.log(state);// {name: "zs", age: 18}
  30. }
  31. return {state, myFn}
  32. }
  33. }
  34. </script>
  35. <style>
  36. </style>

markRaw

将数据标记为永远不能追踪的数据 一般在编写自己的第三方库时使用。

  1. <template>
  2. <div>
  3. <p>{{state}}</p>
  4. <button @click="myFn">按钮</button>
  5. </div>
  6. </template>
  7. <script>
  8. /*
  9. 1.markRaw
  10. 将数据标记为永远不能追踪的数据
  11. 一般在编写自己的第三方库时使用
  12. * */
  13. import {reactive, markRaw} from 'vue';
  14. export default {
  15. name: 'App',
  16. setup() {
  17. let obj = {name: 'lnj', age: 18};
  18. // 不能追踪,监听,作为响应式的数据
  19. obj = markRaw(obj);
  20. let state = reactive(obj);
  21. function myFn() {
  22. // 数据更改了,但是页面ui还是没有发生改变
  23. state.name = 'zs';
  24. }
  25. return {state, myFn}
  26. }
  27. }
  28. </script>
  29. <style>
  30. </style>