Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Vue -使用子组件来添加和更新

Vue -使用子组件来添加和更新
EN

Stack Overflow用户
提问于 2019-04-02 10:46:42
回答 1查看 627关注 0票数 0

我有一个非常简单的父/子组件。我想以两种方式使用子组件-首先用于操作添加一个新条目,第二个用于操作更新实体。

我已经构建了以下组件:https://codepen.io/anon/pen/bJdjyx这里不使用道具,我使用自定义事件将父级和子级的值同步。

添加模板:

代码语言:javascript
运行
AI代码解释
复制
<div id="app">
  <v-app>
    <v-content>
      <v-container grid-list-xl>
        <my-address
          :addresscompany.sync="addressCompany"
          :addressstreet.sync="addressStreet"
          ></my-address>
        <v-btn @click="submit">Submit</v-btn>
      </v-container>
    </v-content>
  </v-app>
</div>

<script type="text/x-template" id="address-template">
    <div>
      <v-text-field
        name="company"
        v-model="addressCompany"
        @change="updateCompany()">
        </v-text-field>
      <v-text-field
        name="street"
        v-model="addressStreet"
        @change="updateStreet()">
        </v-text-field>
    </div>
</script>

添加-脚本:

代码语言:javascript
运行
AI代码解释
复制
let addressComponent = {
  template: '#address-template',

  data() {
    return {
      addressCompany: '',
      addressStreet: '',
    }
  },

  methods: {
    updateCompany () {
      this.$emit('update:addresscompany', this.addressCompany);
    },
        updateStreet () {
      this.$emit('update:addressstreet', this.addressStreet);
    }
  }
};


new Vue({
  el: '#app',
  components: {'my-address' : addressComponent},

  data() {
    return {
      addressCompany: '',
      addressStreet: '',
    }
  },

  methods: {
    submit () {
      console.log('Company ' + this.addressCompany);
       console.log('Street ' + this.addressStreet);
    }
  }
})

但是这个模板不适用于编辑用例,因为我需要道具将值传递给子实例。所以我想出了这个:https://codepen.io/anon/pen/zXGLQG

更新-模板:

代码语言:javascript
运行
AI代码解释
复制
<div id="app">
  <v-app>
    <v-content>
      <v-container grid-list-xl>
        <my-address
          :addresscompany.sync="addressCompany"
          :addressstreet.sync="addressStreet"
          ></my-address>
        <v-btn @click="submit">Submit</v-btn>
      </v-container>
    </v-content>
  </v-app>
</div>


<script type="text/x-template" id="address-template">
    <div>
      <v-text-field
        name="company"
         :value="addressCompany"
        @change="updateCompany()">
        </v-text-field>
      <v-text-field
        name="street"
         :value="addressStreet"
        @change="updateStreet()">
        </v-text-field>
    </div>
</script>

更新-脚本:

代码语言:javascript
运行
AI代码解释
复制
let addressComponent = {
  template: '#address-template',
  props: ['addressCompany', 'addressStreet'],

  data() {
    return {
    }
  },

  methods: {
    updateCompany () {
      this.$emit('update:addresscompany', this.addressCompany);
    },
        updateStreet () {
      this.$emit('update:addressstreet', this.addressStreet);
    }
  }
};


new Vue({
  el: '#app',
  components: {'my-address' : addressComponent},

  data() {
    return {
      addressCompany: 'Company',
      addressStreet: 'Street',
    }
  },

  methods: {
    submit () {
      console.log('Company ' + this.addressCompany);
       console.log('Street ' + this.addressStreet);
    }
  }
})

主要的区别是,对于更新情况,我不对子元素使用v-model,因为我不能直接更改道具。但是使用:value时,更新事件不会被触发。

那么,使用该子组件进行添加和更新的正确方法是什么?在使用Vuex之前必须有一个标准的Vue方法,有吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-04-02 12:44:45

我经常使用以下模式:

创建一个实体的抽象组件,在下面的示例中,我使用了Person.vuefirstNamelastName道具。

代码语言:javascript
运行
AI代码解释
复制
Vue.component('Person' , {
   template: `
    <div>
      <input type="text"
             :value="firstName"
              @input="$emit('update:firstName', $event.target.value)"/>
      <input type="text"
              :value="lastName"
              @input="$emit('update:lastName', $event.target.value)"/>
    </div>
  `,
  props: {
    firstName: String,
    lastName: String
  }
});

此组件的作用域严格限制为绑定到Person对象,响应其更改并更新父对象抛出sync事件修饰符。

接下来,创建一个包装组件,该组件将处理实际对象(即Person.js )的状态。它的子组件Person.vue不关心您是在添加模式还是编辑“模式”。这个组件只负责对模型的变化作出反应。

这个组件应该从API调用或数据存储(更新模式)中加载Person对象,或者创建一个新的空对象,即new Person() (Add )。

下面是一个简单的示例,理想情况下,父组件(在本例中为app)将被拆分,从而减少了helper属性的使用。

代码语言:javascript
运行
AI代码解释
复制
function Person (firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}
Vue.component('Person' , {
  template: `
    <div>
      <input type="text"
             :value="firstName"
              @input="$emit('update:firstName', $event.target.value)"/>
      <input type="text"
              :value="lastName"
              @input="$emit('update:lastName', $event.target.value)"/>
    </div>
  `,
  props: {
    firstName: String,
    lastName: String
  }
});
new Vue({
  el: '#app',
  template: `
    <div>
      <!-- Add mode, should be its own component -->
      <section v-if="promptAdd">
        <Person v-bind.sync="newPerson"/>
        <button type="button" @click="onAdded">Add</button>
      </section>
      <!-- Update mode, should be its own component -->
      <section v-else>
        <p>Users:</p>
        <div v-for="(person, index) in arr" :key="index">
          <Person v-bind.sync="person"/>
        </div>
        <button type="button"
                @click="addNew">Add New User</button>
      </section>
    </div>
  `,
  data: () => ({
    promptAdd: false,
    newPerson: undefined,
    arr: [
      new Person('Bob', 'Smith')
    ]
  }),
  methods: {
    addNew() {
      this.newPerson = new Person();
      this.promptAdd = true;
    },
    onAdded () {
      this.arr.push({ ...this.newPerson });
      this.promptAdd = false;
      this.newPerson = undefined;
    }
  }
})
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app"></div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55481632

复制
相关文章
小程序-渐入渐出动画效果实现
在做小程序列表展示的时候,接到了一个需求。需要在列表展示的时候加上动画效果。在此献上小程序动画效果的教程。
腾讯NEXT学位
2019/08/12
3.2K0
小程序-渐入渐出动画效果实现
Linux基础(进/线程间的竞争)
今天,继续来讨论哲学话题。什么是真正的公平?给你两个选择,第一:全部人排一样的队,吃一样放的饭,赚一样的钱。第二:人人都分三六九等,有人高高在上事事优先,有人人微言轻事事垫底。你觉得如何?
用户2617681
2019/08/07
7660
Linux基础(进/线程间的竞争)
《Flutter 动画系列》组合动画
老孟导读:在项目中动画效果很多时候是几种动画的组合,比如颜色、大小、位移等属性同时变化或者顺序变化,这篇文章讲解如何实现组合动画。
老孟Flutter
2020/09/11
1.3K0
Android动画系列(2)—补间动画
补充: 除了在XML中指定android:layoutAnimation,还可以通过LayoutAnimationController来实现。
八归少年
2022/06/29
7370
Taro React组件使用(1) —— Overlay 遮罩层【渐入渐出动画遮罩层】
Overlay 遮罩层 ---- 提供一个简单的 Overlay 遮罩层,在页面上的层级为 1026; 1. 使用指南 在 Taro 文件中引入组件,将组件放入src下的components文件夹中 import RuiOverlay from "../../components/RuiOverlay/RuiOverlay"; 2. 基础用法 2.1 组件使用 {/* 基本案例 */} <RuiOverlay isOpened={isShowBase} onClose={() => { this.
Rattenking
2022/11/02
1.9K0
基于ThreeJs Heart animation 动画
https://bilibiliou.github.io/assets/download/animations/heart-animation.gif
腾讯IVWEB团队
2020/06/28
1.1K0
Canvas系列(10):动画初级
所谓动画其实就是快读绘制图片,由于人的眼睛更不上屏幕绘制的速率,所以看到的就好像连着的一样,也就形成了动画,动画片就是这个原理,canvas中的动画也是这个原理。提到动画就不得不说一个函数了,那就是requestAnimationFrame。这是一个定时执行的函数,类似于setTimeout,只是间隔时间不再有我们自己手动去设定,而是由计算机自己去计算,这样比我们直接设定的误差更小(通常我们是定1000/60,约等于16.7毫秒,因为CPU的频率一般是60Hz,也就是1秒最多可以刷新60次界面)。但是往往浏览器对requestAnimationFrame的支持不够友好,那这就需要polyfill,通常一种简单的polyfill可以这么写:
kai666666
2020/10/19
8210
Canvas系列(10):动画初级
Canvas系列(12):动画高级
通过前面章节的学习,我们已经学会了直线和部分曲线运动,同时我们也学会了加速、减速、摩擦力等操作。那么动画还有什么需要深入研究下去的呢?当然有,那就是让动画更加平滑,更细滑。
kai666666
2020/10/17
1.1K0
【图表组件套件】上海道宁为开发人员提供Steema下载、试用、教程
Steema Software SL公司成立于1995年,Steema对客户服务的专注始终处于前沿,为客户提供业内更全面、更具成本价值的支持环境。
51Component
2022/07/13
3K0
【图表组件套件】上海道宁为开发人员提供Steema下载、试用、教程
操作系统笔记-进/线程模型
进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。
Cloud-Cloudys
2020/07/25
5480
React中的JSX原理渐析
在react官方中讲到,关于jsx语法最终会被babel编译成为React.createElement()方法。
19组清风
2021/11/15
2.4K0
React中的JSX原理渐析
Canvas系列(11):动画中级
上一章我们讲了简单的动画是如何绘制的,如果没有看上一章的童鞋,请点这里,本章的内容也是接着上一章的内容,代码也只修改其中部分。
kai666666
2020/10/19
7070
Canvas系列(11):动画中级
《Flutter 动画系列一》25种动画组件超全总结
任何程序的动画原理都是一样的,即:视觉暂留,视觉暂留又叫视觉暂停,人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
老孟Flutter
2020/09/11
1.5K0
android 软软的动画弹出菜单,基于Facebook的Rebuond
︿( ̄︶ ̄)︿我是路过的DEMO : https://github.com/CarGuo/AnimationMenu
GSYTech
2018/08/22
9340
android 软软的动画弹出菜单,基于Facebook的Rebuond
基于HTML5的爱心表白动画特效
从视觉上看,它也是一个爱心轮廓,但是不同的是这个爱心轮廓由许多跳动的小爱心组成,更加有一种3D立体的效果。
芯动大师
2022/11/20
2.8K0
《Flutter 动画系列一》25种动画组件超全总结
任何程序的动画原理都是一样的,即:视觉暂留,视觉暂留又叫视觉暂停,人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
老孟Flutter
2020/04/02
1.2K0
图片时载入的渐显特效JQuery
作者:matrix 被围观: 4,685 次 发布时间:2011-10-01 分类:Wordpress 兼容并蓄 | 2 条评论 »
HHTjim 部落格
2022/09/26
16.7K0
图片时载入的渐显特效JQuery
基于 HTML5 Canvas 实现的文字动画特效
前言 文字是网页中最基本的元素,一般我们在网页上都是展示的静态文字,但是就效果来说,还是比较枯燥的。文字淡入淡出的动画效果在项目中非常实用,如果有某些关键的文字,可以通过这种动态的效果来提醒用户阅读。
HT_hightopo
2018/07/06
4K0
股指期货保证金调整,贴水渐行渐远,尔等蓄势待发!
经中国证监会同意,中国金融期货交易所在综合评估市场风险、积极完善监管制度的基础上,稳妥有序调整股指期货交易安排:
量化投资与机器学习微信公众号
2019/02/26
4450
Vue.js 系列教程 5:动画
原文:intro-to-vue-5-animations 译者:nzbin 译者的话:经过两周的努力,终于完成了这个系列的翻译,由于时间因素及个人水平有限,并没有详细的校对,其中仍然有很多不易理解的地方。我和原作者的初衷一样,希望大家能够通过这个系列文章有所收获,至少可以增加学习的乐趣,我也在学习的路上,所学心得必将与大家共勉。 这是 JavaScript 框架 Vue.js 五篇教程的第五部分。在这个系列的最后一部分,我们将学习动画(如果你了解我,你知道这一章迟早会来)。这个系列教程并不是一个完整的用户手
叙帝利
2018/01/17
2.9K0
Vue.js 系列教程 5:动画

相似问题

使用随机值填充c#对象

36

如何使用JSON的值填充现有的对象实例

18

如何使用随机值填充Postgre列

10

如何使用随机对象元素填充<ul>?

10

使用循环使用随机值填充树

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档