Vue当中子组件无法获取父组件值的情况

parent.vue

<template>
  <div>
    <roles :roleData="item" v-for="item of roleData"></roles>
  </div>
</template>

<script>
import Roles from '_c/roles/roles'
import { getRoleInfo } from '@/api/role'
export default {
  name: 'rolelist',
  components: {
    Roles
  },
  data () {
    return {
      roleData: []
    }
  },
  mounted () {
    getRoleInfo().then(res => {
      res = res.data
      if(res.ret && res.data) {
        this.roleData = res.data
      }
    })
  }
}
</script>

child.vue

<template>
  <Card class="card">
     <p slot="title">
        <Icon type="md-settings"></Icon>
        {{roleData.roleName}}
    </p>
    <Form :model="form" :label-width="80">
      <FormItem>
        <CheckboxGroup v-model="form.role" class="checkbox-group" :size="size">
          <Checkbox :label="item" class="checkbox" v-for="item of data" :key="item">
              <span>{{item}}</span>
          </Checkbox>
        </CheckboxGroup>
      </FormItem>
      <FormItem>
        <Button type="primary" @click="handleSubmit('form')" class="btn">提交</Button>
      </FormItem>
    </Form>
  </Card>
</template>

<script>
import { postRoleInfo } from '@/api/role'
export default {
  name: 'rolelist',
  data () {
    return {
      icon: 'ios-key',
      size: 'large',
      data: [],
      form: {
        role: []
      }
    }
  },
  props: {
    roleData: {
      type: Object,
      default () {
        return {
          roleName: '',
          function: []
        }
      }
    }
  },
  methods: {
    handleManage (data) {
      data.forEach((item) => {
        if(item.isHave) {
          this.form.role.push(item.functionName)
        }
        this.data.push(item.functionName)
      })
    },
    handleSubmit (name) {
      this.$Message.success('Success!');
      postRoleInfo(this.form)
    }
  },
  mounted () {
    this.handleManage(this.roleData.function)
  }
}
</script>

<style lang="less" scoped>
  .card{
    margin-bottom: 20px;
  }
  .checkbox-group{
    font-size: 16px;
  }
  .checkbox{
    margin: 30px;
  }
  .btn{
    float: right;
    margin-right: 165px;
  }
</style>

上面这种写法是可以正常获取到值的 

但是如果我改成下面这种

parent.vue

虽然 {{roleData.roleName}}值是能够传过去的,但是内容就空了

只能通过监听child.vue组件中的props接收的roleData数据才能够显示

具体原因还不知道,如果有人知道,希望能在下面提一下T.T

原因好像是Vue不会监听数值下标赋值,只能通过数组的变异方法来同步视图

### Vue2 中子组件修改父组件数据的方式 在 Vue2 中,子组件可以通过事件机制来通知父组件更新其状态。这种设计遵循单向数据流的原则,即父组件通过 `props` 将数据传递给子组件,而子组件则通过 `$emit` 向父组件发送事件以触发回调函数。 以下是实现这一功能的具体方法: #### 1. **通过 $emit 发送自定义事件** 子组件可以使用 `$emit` 方法向父组件发出一个事件,并携带需要更新的数据作为参数。父组件监听该事件并执行相应的逻辑来更新自己的数据。 ##### 父组件 Parent.vue ```html <template> <div> <p>父组件中的:{{ parentData }}</p> <!-- 子组件 --> <ChildComponent @update-parent-data="handleUpdate"></ChildComponent> </div> </template> <script> import ChildComponent from &#39;./ChildComponent.vue&#39;; export default { components: { ChildComponent }, data() { return { parentData: &#39;初始&#39;, }; }, methods: { handleUpdate(newVal) { this.parentData = newVal; }, }, }; </script> ``` ##### 子组件 ChildComponent.vue ```html <template> <button @click="sendValueToParent">点击修改父组件</button> </template> <script> export default { methods: { sendValueToParent() { const newValue = &#39;来自子组件的新&#39;; this.$emit(&#39;update-parent-data&#39;, newValue); }, }, }; </script> ``` 在这个例子中,当用户点击按钮时,子组件会调用 `this.$emit(&#39;update-parent-data&#39;, newValue)` 并将新传递给父组件父组件接收到这个事件后,在 `handleUpdate` 方法中更新自身的 `parentData` 属性[^1]。 --- #### 2. **使用 v-model 实现双向绑定** 虽然严格来说这不是真正的双向绑定(因为仍然依赖于 `$emit`),但在某些场景下可以用这种方式简化父子组件之间的交互。 ##### 父组件 Parent.vue ```html <template> <div> <p>父组件中的:{{ parentModel }}</p> <!-- 子组件 --> <ChildComponent v-model="parentModel"></ChildComponent> </div> </template> <script> import ChildComponent from &#39;./ChildComponent.vue&#39;; export default { components: { ChildComponent }, data() { return { parentModel: &#39;初始模型&#39;, }; }, }; </script> ``` ##### 子组件 ChildComponent.vue ```html <template> <input :value="modelValue" @input="onInput"> </template> <script> export default { props: [&#39;modelValue&#39;], // 接收父组件传入的 methods: { onInput(event) { this.$emit(&#39;input&#39;, event.target.value); // 更新父组件 }, }, }; </script> ``` 在这种情况下,`v-model` 是一种语法糖,它实际上做了两件事: - 给子组件传递了一个名为 `modelValue` 的 prop。 - 监听子组件上的 `input` 事件以便同步到父组件的状态中[^3]。 --- #### 3. **通过 Refs 访问父组件实例** 如果确实需要直接操作父组件的数据,则可以在子组件内部通过 `this.$parent` 或者由父组件显式提供对自身实例的引用来进行访问。不过这种方法不推荐用于常规开发,因为它破坏了组件间的解耦性。 ##### 示例代码 ```javascript // 子组件可以直接这样写 console.log(this.$parent.somePropertyOfParent); // 更好的做法是由父组件主动暴露自己的一部分 API const parentInstance = this.$listeners[&#39;get-parent-instance&#39;](); if (parentInstance && typeof parentInstance.update === &#39;function&#39;) { parentInstance.update(newValue); } ``` 尽管如此,还是建议优先采用基于事件驱动的设计模式[^2]。 --- ### 总结 Vue2 提供了几种灵活的方式来让子组件影响父组件的数据变化。最常见的是利用 `$emit` 配合特定命名约定完成任务;对于简单的输入框等控件还可以借助 `v-model` 达成更简洁的效果。无论哪种方式都应尽量保持清晰易懂以及良好的可维护特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值