Akses contoh boleh gubah vue dalam fungsi?
P粉845862826
P粉845862826 2023-08-29 08:59:18
0
1
595
<p>Andaikan saya mempunyai fungsi boleh gubah vue mudah yang saya mahu gunakan semula beberapa kali sepanjang aplikasi saya. Dalam kes ini, ia mempunyai sifat reaktif (produk, tatasusunan yang mengandungi senarai produk) dan kaedah "tambahProduk" yang menolak elemen baharu ke tatasusunan. </p> <pre class="brush:php;toolbar:false;">fungsi eksport useCart(){ produk const = ref([]) const addProduct() =>{ products.push({item: "Baseball Cap", kuantiti: 1}) } kembali { produk, tambahProduk } }</pre> <p>Ia berfungsi hebat. Walau bagaimanapun, saya ingin menghantar contoh troli boleh gubah ke setiap baris supaya baris itu boleh mengakses "troli" induk melalui "troli" harta. </p> <p>Saya harap perkara berikut berfungsi. Saya percaya "ini" harus merujuk kepada objek yang dipanggil fungsi (contoh troli beli-belah): </p> <pre class="brush:php;toolbar:false;">fungsi eksport useCart(){ produk const = ref([]) const addProduct() =>{ //ini sepatutnya contoh troli boleh digubah? products.push({item: "Tudung Besbol", kuantiti: 1, troli: ini}) } kembali { produk, tambahProduk } }</pre> <p>Walau bagaimanapun, apabila saya menguji dalam komponen menggunakan komposit, nilai "ini" tidak ditentukan: </p> <pre class="brush:php;toolbar:false;">const testCart = useCart testCart.addProduct()</pre> <p>Mengapa "ini" tidak ditakrifkan dalam konteks ini dan bagaimana saya boleh mengakses contoh boleh gubah dalam kaedah boleh gubah? </p>
P粉845862826
P粉845862826

membalas semua(1)
P粉258788831

Jika anda melakukannya dengan betul, ia akan berkesan.

Tetapi anda perlu menggunakan functions() 而不是 lambda,因为 lambda 没有上下文,并且 this = windowkod>

const addProduct = function() {
    //this should be the instance of the cart composable?
    products.value.push({item: "Baseball Cap", quantity: 1, cart: this})
}

Tetapi saya menghadapi masalah menggunakan konteks this dalam atribut .cart.

serupa dengan cart.products.value[0].cart.products. Ia hanya tidak berfungsi.

Saya cadangkan anda memikirkan semula reka bentuk. Saya tidak akan berbuat demikian.

Lihat taman permainan. Kali kedua ialah tingkap.

const { ref } = Vue;

const useCart = function() {
    const products = ref([])
    const addProduct1 = function() {
        //this should be the instance of the cart composable?
        products.value.push({item: "Baseball Cap", quantity: 1, cart: this})
    }
    const addProduct2 = () => {
        //this should be the instance of the cart composable?
        products.value.push({item: "Baseball Cap", quantity: 1, cart: this})
    }
    return {
        products,
        addProduct1,
        addProduct2
    }
}

const cart = useCart();
cart.addProduct1();
console.log(cart.products.value[0].cart)
cart.addProduct2();
console.log(cart.products.value[1].cart)
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan