Vue组件provide,inject的代码及总结

发布时间:2024年01月18日

//provide,inject能够跨组件将数据传递,就是说如果有像需要子传父this.$emit的多层,才能把数据传递的情况使用很方便

//需要注意的是不能直接在provide函数里面写函数,因为在函数里面this指向window,所以要在methods方法里面写函数,然后命名:this引用这个函数

//另外由于基本数据类型有失去响应性的原因,就需要用计算属性写函数的形式成为引用类型

<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <meta name="viewport" content="width=device-width, initial-scale=1.0">
? <title>Document</title>
</head>
<body>
? <div id="app">
? ? <div>根</div>
? ? <div>{{ appMessage }} <button @click="appMessage = '你好'">修改message</button></div>
? ? <first></first>
? </div>

? <script src="./lib/vue.global.js"></script>
? <script>
? ? const stu = {
? ? ? name: '张三',
? ? ? nickname: this.name
? ? }
? </script>
? <script>
? ? Vue
? ? ? .createApp({
? ? ? ? data() {
? ? ? ? ? return {
? ? ? ? ? ? appMessage: '这是 App 在 data 中定义的 message',
? ? ? ? ? ? appTodos: [],
? ? ? ? ? }
? ? ? ? },
? ? ? ? methods: {
? ? ? ? ? todoAdd() {
? ? ? ? ? ? this.appTodos.push(54)
? ? ? ? ? },
? ? ? ? },
? ? ? ? provide() {?
? ? ? ? ? return {
? ? ? ? ??
? ? ? ? ? ? message: Vue.computed(() => this.appMessage),
? ? ? ? ? ? todos: Vue.computed(() => this.appTodos),
? ? ? ? ? ? add: this.todoAdd
? ? ? ? ? }
? ? ? ? },
? ? ? })
? ? ? .component('first', {
? ? ? ? template: `<div>第一层<second></second></div>`,
? ? ? })
? ? ? .component('second', {
? ? ? ? template: `<div>第二层<third></third></div>`,
? ? ? })
? ? ? .component('third', {
? ? ? ? template: `<div>
? ? ? ? ? 第三层
? ? ? ? ? 共享到的根数据是: {{ message }},数组长度: {{ todos.length }}
? ? ? ? ? <fourth></fourth>
? ? ? ? </div>`,
? ? ? ? inject: ['message', 'todos'],?
? ? ? })
? ? ? .component('fourth', {
? ? ? ? template: `
? ? ? ? ? <div>第四层</div>
? ? ? ? ? <button @click="add">使用祖先节点中共享的方法</button>
? ? ? ? `,
? ? ? ? inject: ['add'],
? ? ? })
? ? ? .mount('#app')
? </script>
</body>
</html>

文章来源:https://blog.csdn.net/qq_52840130/article/details/135681915
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。