VUE子组件如何改变父组件传来的值,以及VUE子组件如何修改父组件的值,以及父组件修改子组件的值

一)子组件修改父组件传来的值:

父组件传递给我一个名为deptName数据,但是现在我要在子组件中修改它的值并且实时更新页面,直接this.deptName是不能直接修改他的值的,所以我采用了使用一个中间变量来接受的方式对齐进行修改:

 1、父组件:

2、子组件:

在data中定义一个变量接受,然后将其赋值为this.deptName即可,之后就可以正常修改data的方法对齐进行修改了。

二)子组件修改父组件中的值:

VUE2案例:

我要删除一个值,这个逻辑是在子组件进行的,所以父组件的数组中值没有少但是数据库的值已经改变了,只有下次刷新页面的时候才能看到效果,这样体验非常不好,此时我们需要用子组件来修改父组件的值来达到这个目的。 

1、父组件:正常引用,但是子组件要绑定一个事件(名称自己起,我这里事件名和函数名都叫callBack)

 2、来到子组件,(我这里是长按子组件实现删除操作,所以就在那个长按的函数里写$emit来传递值):

下面$emit的第一个参数必须是上述父组件中@后面的事件名,第二个之后的参数就是传递的值。

 3、此时我们来到父组件:实现callBack函数:

 这样就完成删除了父组件中的数组中的某个值,数据是实时变化的了。

VUE3写法:

案例说明:子组件写了一个点击事件,当点击时就会给父组件传递一个值

子组件:

html部分:

<template>
  <!-- 子组件向父组件传值: -->
  <img :src="url" @click="clickSub" />
</template>

script部分:

<script>
//定义了要传递的值
const vals = 1;

export default {
  name: "swiper",
  props: {
    url: {
      type: String,
      default: "",
    },
  },
    //此处要写context参数,用于传递值
  setup(props, context) {
//点击之后触发的事件
    function clickSub() {
//第一个参数是事件的名称。第二个是事件要传递的值
      context.emit("sub-event", vals);
    }
//将值和函数注册到setup函数中
    return {
      vals,
      clickSub,
    };
  },
};
</script>

父组件:

html:

<template>
  <!-- 子组件向父组件传值: -->
  <swipers @sub-event="subClick" :url="img3" />
</template>

script部分:

<script>
//获取子组件传递来的值
function subClick(e) {
  console.log(e);
}

export default {
  name: "App",
  components: {
    swipers: swiper, //注册组件,标签叫什么还是从这决定的
  },

  setup() {
    return {
    };
  },
};
</script>

三、父组件修改子组件的值:

父组件:

1、因为我们要实现双向数据绑定,所以数据必须是响应式对象。那我们首先导入vue的响应式函数,以及定义一个响应式对象:

//父组件修改子组件的值
import { ref } from "vue";
const numChange = ref(1);
  function numChanges(){
    numChange.value+=1;
  }

2、逻辑描述:我们给子组件传递一个num属性,然后在父组件中有一个按钮,每次按钮点击这个数字的值就会变化,我们想验证子组件的值也随着父组件值的变化而变化。

html部分:

<template>
  <swipers :num="numChange"/>
  <button @click="numChanges()">click</button>
</template>

script部分:

<script>
//导入组件
import swiper from "./components/swiper.vue";

//父组件修改子组件的值
import { ref } from "vue";
const numChange = ref(1);
  function numChanges(){
    numChange.value+=1;
 }

export default {
  name: "App",
  components: {
    swipers: swiper, //注册组件,标签叫什么还是从这决定的
  },

  setup() {
//定义完函数和变量之后在setup函数中注册
    return {
      numChange,
      numChanges
    };
  },
};
</script>

 子组件:

<template>
  <img :src="url" />
  <div>{
   
   { num }}</div>
</template>
<script>
export default {
  name: "swiper",
  props: {
    num: {
      type: Number,
    },
  },
  setup(props) {
    //获取url的值
    console.log(props.Number);
  },
};
</script>

效果:

每次点击click就会使值发生变化。

猜你喜欢

转载自blog.csdn.net/weixin_60414376/article/details/124229198