Vue 3 获取代理的值

rah*_*ver 25 ionic-framework vuejs3 vue-composition-api

这是我的RequestList.vue组件

<template>
  <ion-item v-for="request in requests" @click="showRequest(request)" :key="request.id"
            text-wrap>
    <ion-label>
      <b>Name:</b> {{ request.event.name }}
      <br>
      <b>Venue:</b>{{ request.event.venue.name }}
      <br>
      <b>Date:</b> {{ request.event.date }}
    </ion-label>
  </ion-item>
</template>

<script>
import {useRouter} from 'vue-router'
import {IonItem, IonLabel} from '@ionic/vue'
import store from '@/store';
export default {
  components: {
    IonLabel,
    IonItem
  },
  props: {
    requests: Array
  },
  setup(props) {
    const router = useRouter()
    const showRequest= (request)=> {
      console.log('request', props.request);
      store.requests.setRequest(props.requests);
    };
    return {router, showRequest}
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

我的store/modules/requests.js档案

import {computed, ref} from "vue";

const state = ref({
  request: null
});

export function setRequest(request) {
  state.value.request = request;
}

export const getRequest = computed(() => state.value.request);
Run Code Online (Sandbox Code Playgroud)

Requests.vue正在使用的组件RequestList.vue

<template>
  <ion-page>
    <ion-header>
      <ion-toolbar></ion-toolbar>
    </ion-header>
    <ion-content class="ion-padding-start ion-padding-end">
      <ion-list-header>
        <ion-label>
          <b>Requests</b>
        </ion-label>
      </ion-list-header>
      <div v-if="!loading">
        <request-list :requests="requests" />
      </div>
      <div v-else>
        <ion-spinner class="spin"></ion-spinner>
      </div>
    </ion-content>
  </ion-page>
</template>

<script>
import { defineComponent } from 'vue'
import { IonContent, IonHeader, IonLabel, IonListHeader, IonPage, IonSpinner, IonToolbar } from '@ionic/vue'
import { reactive, toRefs } from '@vue/reactivity'
import { onMounted } from '@vue/runtime-core'
import RequestList from '../components/RequestList'
import firestoreService from '@/services/firestore'

export default defineComponent({
  components: {
    IonContent,
    IonPage,
    IonLabel,
    IonHeader,
    IonSpinner,
    IonToolbar,
    IonListHeader,
    RequestList
  },
  setup() {
    const state = reactive({
      requests: [],
      loading: false
    })

    onMounted(async () => {
      state.loading = true
      try {
        state.requests = await firestoreService.getClaimableRequestsForCurrentUser()
      } catch (e) {
        console.log('error occurred fetching requests for current user', e)
      } finally {
        state.loading = false
      }
    })
    return {
      ...toRefs(state),
    }
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)

我的问题是,在上面的 RequestList.vue 中,处理程序作为代理showRequest发送。request这就是为什么要store.requests.setRequest(props.requests)在商店中设置代理。而我需要 props.requests 的值。

那么我在这里该怎么做呢?

her*_*slm 54

有多种方法可以获取代理的原始值:

1.(我推荐的方式)Vue 3 Reactivity utils 函数,请参阅Reactivity API

import { isProxy, toRaw } from 'vue';
if(isProxy(proxyObject)){ //this If() block is not really necessary
  const rawObject = toRaw(proxyObject)
}
//But it is not recommended to hold a persistent reference to the original object. Use with caution.
Run Code Online (Sandbox Code Playgroud)

2. 使用 JSON 字符串化/解析:

const rawObject = JSON.parse(JSON.stringify(proxyObject));
Run Code Online (Sandbox Code Playgroud)

3. 解构:

const rawObject = {...proxyObject};
Run Code Online (Sandbox Code Playgroud)

4.对象.分配:

const rawObject = Object.assign({}, proxyObject);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您指出 Vue api,帮助很大! (3认同)

Dan*_*iel 5

最简单的方法可能是使用 JSON stringify/parse

    const showRequest = (request)=> {
      const reqObject = JSON.parse(JSON.stringify(request));
      console.log('request', reqObject);
      store.requests.setRequest(reqObject);
    };
Run Code Online (Sandbox Code Playgroud)

解构({..request}Object.assign({}, request)))有时也有效,但前提是您有单级代理,而字符串化/解析将在整个对象上工作(只需确保您没有任何循环对象值即可。