问答

vue child监听parent的prop变化失败

作者:admin 2021-07-01 我要评论

需求 省市区层级菜单自动加载并自动切换 代码 # form.htmlarea-three-select v-bind:inits="['1','40','596']"/area-three-select #AreaThreeSelect.vuetemplate...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

需求

省市区层级菜单自动加载并自动切换

代码

# form.html
<area-three-select v-bind:inits="['1','40','596']"></area-three-select>
#AreaThreeSelect.vue
<template>
    <div class="form-row">
        <SelectItem v-for="(item,index) in items" :key="index" :item="item" :inits.sync="inits"/>
    </div>
</template>

<script>
    import axios from "axios"
    import SelectItem from './SelectItem.vue'

    let nextTodoId = 1;

    export default {
        props: ['inits'],
        components: {
            SelectItem
        },
        data() {
            return {
                items: [
                    {id: "d1", name: "省份"},
                    {id: "d2", name: "地区"},
                    {id: "d3", name: "城市"}
                ]
            }
        },
        mounted() {
            let vm = this;
            this.$root.$on('changed2', (key, val) => {
                vm.inits[key] = val;
                for (let i = key + 1; i < vm.inits.length; i++) {
                    vm.inits[i] = '0';
                }
                console.log('changed2 = ', this.inits)
            })
        }
    }
</script>
# SelectItem.vue
<template>
    <div class="col-md-3 mb-3">
        <label v-bind:for="'link-'+item.id">{{ item.name }}</label>
        <select v-bind:id="'link-'+item.id" v-bind:name="item.id" v-on:change="onChange()" class="custom-select"
                v-model="selected">
            <option v-for="option in options" v-bind:value="option.id">{{ option.name }}</option>
        </select>
    </div>
</template>

<script>
    import axios from "axios"

    export default {
        props: {
            inits: {
                type: Array,
                required: true
            },
            item: {
                type: Object,
                required: true
            }
        },
        data() {
            return {
                selected: '',
                options: []
            }
        },
        methods: {
            onChange(e) {
                this.$root.$emit('changed2', this.$vnode.key, this.selected);
            },
            make() {
                console.log('make ' + this.$vnode.key);
                let pid = -1;
                if (this.$vnode.key === 0) {
                    pid = 0;
                } else if (this.inits.hasOwnProperty(this.$vnode.key - 1) && this.inits[this.$vnode.key - 1] > 0) {
                    pid = this.inits[this.$vnode.key - 1];
                }

                if (pid > -1) {
                    axios.get('/api/area/json/' + pid)
                        .then(resp => {
                            this.options = [{id: "", name: ""}, ...resp.data];
                        })
                        .catch(err => console.log('err => ', err))
                }
            }
        },
        watch: {
            inits: {
                immediate: true,
                handler(val) {
                    console.log('watch inits key = ', this.$vnode.key, val)
                },
                deep: true
            }
        },
        created() {
            this.selected = this.inits[this.$vnode.key];
            this.make();
        }
    }
</script>

问题

运行之后自动定位了加载了层级,但是当父节点传入进来的inits这个prop发生改变之后,省市区的子节(inits[0] inits[1] inits[2] )监听了,但是子节点里没有任何运行(几个子节点,文件SelectItem.vue的watch里面不执行)。

###

在#AreaThreeSelect.vue 使用 立即监听inits, 回调函数中对 inits 进行手动初始化

###

试试 this.$set 改变 inits

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • vue child监听parent的prop变化失败

    vue child监听parent的prop变化失败

  • 想问一下大家如何把鱼眼图片展示为360

    想问一下大家如何把鱼眼图片展示为360

  • pandas如何实现这种行列的转换?stack?

    pandas如何实现这种行列的转换?stack?

  • vue嵌套在iframe中的页面如何在刷新之

    vue嵌套在iframe中的页面如何在刷新之

腾讯云代理商
海外云服务器