使用 Vue 的点击编辑文本字段

Posted

技术标签:

【中文标题】使用 Vue 的点击编辑文本字段【英文标题】:Click-to-Edit text field with Vue 【发布时间】:2017-12-16 10:26:55 【问题描述】:

我正在使用 Vue js 并在编辑字段时遇到问题。当我单击某个字段进行编辑时,所有可编辑字段将变为活动状态。这是我的代码。

 export default 
        props: ['profileHeight'],

        data() 
            return 
                User: User,
                isEditing: false,
                form:
                    name:'',
                    email: '',
                ,
            ;
        ,

        mounted() 
        ,

        methods: 
            activateInEditMode() 
                this.isEditing = true
            ,
            deActivateInEditMode() 
                this.isEditing = false
            
        
    
 <span>Profile settings</span>
                        <p>Full name<span v-on:click="activateInEditMode" v-show="!isEditing">User.state.auth.name</span>
                            <span v-show="isEditing" >
                             <input v-model="form.name" type="text" class="form-control" >
                            </span>
                        </p>

                        <p>E-mail<span>User.state.auth.email</span>
                            <span v-show="isEditing" >
                             <input v-model="form.email" type="text" class="form-control" >
                            </span>
                        </p>

【问题讨论】:

您对两者都使用了相同的v-model="form.name"!换成不同的! 也把form: name:'', email: '' 加入data() 你的问题解决了!:) @HirenGohel 不是真的,因为它会检查 isEditing 变量并显示所有字段。 好的,但是您需要定义它以进行编辑!我知道定义这个问题没有解决! 【参考方案1】:

尝试使用焦点和模糊方法来显示/隐藏表单元素! 希望这会有所帮助!

                            
new Vue(
  el: '#app',
  data()
    return 
      user : 
        name: '',
        email: ''
      ,
      editField : ''
    
  ,
  methods : 
    focusField(name)
      this.editField = name;
    ,
    blurField()
      this.editField = '';
    ,
    showField(name)
      return (this.user[name] == '' || this.editField == name)
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
<div id="app">
  <h1>Profile settings</h1>
  <label for="user-name">Full name</label>
  <div class="field">
    <span class="field-value" v-show="!showField('name')" @click="focusField('name')">user.name</span>
    <input v-model="user.name" v-show="showField('name')" id="user-name" type="text" class="field-value form-control" @focus="focusField('name')" @blur="blurField">
  </div>
  
  <label for="user-email">Email address</label>
  <div class="field">
    <span class="field-value" v-show="!showField('email')" @click="focusField('email')">user.email</span>
    <input v-model="user.email" v-show="showField('email')" type="email" class="field-value form-control" @focus="focusField('email')" @blur="blurField">
  </div>
</div>

【讨论】:

正在寻找一个最佳解决方案,这样我就不需要创建计算属性,表单可能有 10 个字段,所以我需要创建 10 个计算属性? 您可以定义方法。看看编辑过的例子 如果我们不对文本进行任何更改,它不会在模糊时关闭【参考方案2】:

有很多方法可以做到这一点。我可能会推荐一个组件。

console.clear()

Vue.component("editable",
  props:["label", "value"],
  template:`
  <p>
    label 
    <span @click="editing=true" v-show="!editing">
      value
    </span>
    <span v-show="editing" >
      <input :value="value"
             @input="$emit('input', $event.target.value)"
             @keydown.enter="editing=false"
             type="text" 
             class="form-control" >
    </span>
  </p>
  `,
  data()
    return 
      editing: false,
    
  
)

const User = 
  name: 'bob',
  email: 'bob@example.com'


new Vue(
  el:"#app",

  data() 
    return 
      form: User
    ;
  ,
)
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">
  <span>Profile settings</span>
  <editable label="Full name" v-model="form.name"></editable>
  <editable label="E-mail" v-model="form.email"></editable>
  <br>
  form
</div>

【讨论】:

【参考方案3】:

我为此编写了一个组件,我称之为Click-to-Edit

它的作用:

支持v-model 在单击其他位置和按 Enter 时保存更改

ClickToEdit.vue:

<template>
  <div>
    <input type="text"
           v-if="edit"
           :value="valueLocal"
           @blur.native="valueLocal = $event.target.value; edit = false; $emit('input', valueLocal);"
           @keyup.enter.native="valueLocal = $event.target.value; edit = false; $emit('input', valueLocal);"
           v-focus=""
             />
        <p v-else="" @click="edit = true;">
          valueLocal
        </p>
    </div>
</template>

<script>
  export default 

  props: ['value'],

  data () 
  return 
      edit: false,
      valueLocal: this.value
    
  ,

  watch: 
    value: function() 
      this.valueLocal = this.value;
    
  ,

  directives: 
    focus: 
      inserted (el) 
        el.focus()
      
    
  


</script>

【讨论】:

以上是关于使用 Vue 的点击编辑文本字段的主要内容,如果未能解决你的问题,请参考以下文章

在编辑另一个文本字段 vue.js 时获取计算属性并传递其值

vue 实现点击复制文本

vue tinymce 控制图片大小上传,以及富文本编辑框在dialog的问题

Qt基于Qml文本字段编辑完成事件处理

IOS swift - 如何在点击文本字段时打开新视图控制器后结束文本字段中的编辑

没有在自定义单元格上调用文本字段确实开始编辑