首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果一个下拉列表中的值发生了变化,如何重新加载第二个下拉列表的值?如何在InertiaJs中实现局部重发

如果一个下拉列表中的值发生了变化,如何重新加载第二个下拉列表的值?如何在InertiaJs中实现局部重发
EN

Stack Overflow用户
提问于 2022-08-03 10:21:19
回答 1查看 231关注 0票数 0

问:如果一个下拉列表中的值发生变化,如何重新加载第二个下拉列表的值?

当用户更改category下拉列表时,我希望在下拉列表中显示subcategory

前端: VueJs (v3)

服务器端呈现: IneratiaJs

后端: Laravel (v9)

VueComponent

代码语言:javascript
运行
复制
 const props = defineProps({
  errors: Object,
  categories: Object,
  subcategories: Object,
})

const form = useForm({
    category_id: '',
    subcategory_id: '',
    name: '',
    price: '',
    discount: '',
    image: 'sample',
    description: ''
});


let getSubcategory = (event) => {
    
    if(event.target.value !== "") {

       Inertia.reload({   
                'category_id': event.target.value 
            },
            {   only: ['subcategories'],
                onSuccess: page => {
                    alert();
                    console.log('onSuccess');
                    console.log(props.categories);
                    console.log(props.subcategories);
                    console.log(page);
                }
            }
        );
    }
}

const submit = () => {
    form.post(route('store.subcategory'), {
        onFinish: () => form.reset(),
    });
};

Vue模板

代码语言:javascript
运行
复制
<template>
    <Head title="Add Product" />

    <BreezeAuthenticatedLayout>
        <template #header>
           
                <form @submit.prevent="submit">
                   <div class="mt-4">
                        <BreezeLabel for="category_id" value="Category Name" />
                        <select @change="getSubcategory" v-model="form.category_id"  id="category_id" class="block mt-1 w-full">
                            <option value="">Select Category</option>
                            <option  v-for="category in categories"  :value="category.id">{{ category.name }}</option>
                        </select>
                        <div v-if="errors.category_id" class="text-red-400">
                            {{ errors.category_id }}
                        </div>
                    </div>

                    <div class="mt-4">
                         <BreezeLabel for="subcategory_id" value="Subcategory Name" />
                        <select v-model="form.subcategory_id" id="subcategory_id" class="block mt-1 w-full">
                            <option value="">Select Sategory</option>
                            <option  v-for="subcategory in subcategories"  :value="subcategory.id">{{ subcategory.name }}</option>
                        </select>
                        <div v-if="errors.subcategory_id" class="text-red-400">
                            {{ errors.subcategory_id }}
                        </div>
                    </div>
                </form>
 </BreezeAuthenticatedLayout>
</template>

routes/web.php Laravel路由:

代码语言:javascript
运行
复制
Route::get('/create/product/{category_id?}', [ProductController::class, 'create'])->name('create.product'); //Form: Create Product

ProductController.php 产品控制器:

代码语言:javascript
运行
复制
public function create($category_id = null)
    {        
        return Inertia::render('Product/Create', [          
            //I want Evaluated immediately on Page Load.
            'categories' =>  $categories = Category::all(),

            //Want Lazy load here.
            'subcategories' => function(){                            
                if(!empty($category_id)){
                    $category = Category::find($category_id); 
                    $subcategories = $category->subcategories()->get();
                }
            },
        ]);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 19:05:04

Create method安装在产品控制器script setup中后,开始工作

代码语言:javascript
运行
复制
public function create($category_id = null)
    {       
        return Inertia::render('Product/Create', [

            // ALWAYS included on first visit - OPTIONALLY included on partial reloads - ALWAYS evaluated            
            'categories' => Category::has('subcategories')->get(),

            // NEVER included on first visit - OPTIONALLY included on partial reloads - ONLY evaluated when needed
            'subcategories' => Inertia::lazy(fn () =>              
                Subcategory::with('category')->where('category_id', '=', $category_id)->get()                    
            ),
        ]);
    }

Vue脚本:我发送了错误的参数。然后在官方站点上看到了部分松弛的正确方式

代码语言:javascript
运行
复制
let getSubcategory = (event) => {    
    if(event.target.value !== "") {
       Inertia.visit(
            route('create.product', { 
                category_id: event.target.value
            }),{ 
                only: ['subcategories'],
                preserveState: true,
                preserveScroll: true,
            }
        );
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73220061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档