javascript Vue 3-如何根据输入数字启用/禁用文本输入和复选框

kmbjn2e3  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(149)
<div class="container-body" v-for="index in 10" :key="index">
    <div class="container-content"></div> 
    <div class="container-content">
        <input :id="'Row'+index+'-input1'" type="text">
    </div> 
    <div class="container-content">
        <input :id="'Row'+index+'-input2'" type="text" class="disabled">
    </div> 
    <div class="container-content">
        <div class="custom-control custom-checkbox">
            <input :id="'Row'+index+'checkbox'" class="form-check-input" type="checkbox" disabled>
        </div>
    </div> 
    <div class="container-content delete">
        <img/>
    </div>
</div>

我将使用v-for有10个输入行。
我需要做到:当用户在Row 1-input 1上输入数字时,将启用Row 1-input 2和Row 1-复选框。输入使能不应影响其他9行。此外,当我单击删除div时,它应该清除整行值。
我不知道如何在Vue中实现这一点。我应该创建10个数据变量,并保存值onkeyup,并使用它绑定:禁用?或者有什么Vue方法可以实现这一点?

h4cxqtbf

h4cxqtbf1#

下面是一种方法:

<template>
  <div>
    <div class="container-body" v-for="(row, index) in rows" :key="index">
      <div class="container-content"></div>
      <div class="container-content">
        <input :id="'Row'+index+'-input1'" type="text" @input="enableRow(index)" v-model="row.input1">
      </div>
      <div class="container-content">
        <input :id="'Row'+index+'-input2'" type="text" class="disabled" :disabled="!row.input1">
      </div>
      <div class="container-content">
        <div class="custom-control custom-checkbox">
          <input :id="'Row'+index+'checkbox'" class="form-check-input" type="checkbox" :disabled="!row.input1" v-model="row.checkbox">
        </div>
      </div>
      <div class="container-content delete" @click="clearRow(index)">
        <img />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      rows: Array(10).fill({
        input1: '',
        input2: '',
        checkbox: false
      })
    };
  },
  methods: {
    enableRow(index) {
      if (this.rows[index].input1) {
        this.rows[index].input2 = '';
        this.rows[index].checkbox = false;
      }
    },
    clearRow(index) {
      this.rows[index].input1 = '';
      this.rows[index].input2 = '';
      this.rows[index].checkbox = false;
    }
  }
};
</script>
e1xvtsh3

e1xvtsh32#

我认为最好的方法是为一行代码创建一个组件,您可以在其中放置用于处理一个示例的所有逻辑。然后创建所需数量的此类组件。
下面是你的任务的一个示例实现,如果我理解正确的话:

const {
  computed,
  createApp,
  ref,
} = Vue;

const defaultRowValue = {
  input1: '',
  input2: '',
  checkbox: false
}

const customRow = {
  props: ['index', 'modelValue'],
  emits: ['update:modelValue'],
  setup(props, {
    emit
  }) {

    const model = computed({
      get: () => props.modelValue,
      set: (val) => {
        emit('update:modelValue', val)
      }
    })

    const disable = computed(() => model.value.input1);

    const clearRow = () => {
      model.value = { ...defaultRowValue
      };
    }

    return {
      model,
      clearRow,
      disable,
    }
  },
  template: `
  <div class="container-body">
      <div class="container-content"></div>
      <div class="container-content">
        <input :id="'Row'+index+'-model.input1'" type="text" v-model="model.input1">
      </div>
      <div class="container-content">
        <input :id="'Row'+index+'-model.input2'" type="text" v-model="model.input2" class="disabled" :disabled="!disable">
      </div>
      <div class="container-content">
        <div class="custom-control custom-checkbox">
          <input :id="'Row'+index+'checkbox'" class="form-check-input" type="checkbox" :disabled="!disable" v-model="model.checkbox">
        </div>
      </div>
      <div class="container-content delete">
        <button @click="clearRow">delete</button>
      </div>
    </div>
  `
}

const app = createApp({
  data() {
    return {
      rows: []
    };
  },
  mounted() {

    // Create test data
    for (let i = 0; i < 10; i++) {
      this.rows.push({ ...defaultRowValue
      })
    }
  }
})

app.component("custom-row", customRow);

app.mount('#app');
#app {
  display: flex;
}
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
  <div>
    <custom-row v-for="(_, key) in rows" :key="key" :index="key" v-model="rows[key]"></custom-row>
  </div>
  <pre>
    {{rows}}
    </pre>
</div>
zbq4xfa0

zbq4xfa03#

您需要找到输入的唯一性
正如我之前所说,你可以把输入设为:valuev-model
然后将每个字符串和索引连接起来,以形成唯一的输入。
在这样做的时候,你需要返回一个array类型的输入v模型NOTa string类型。
这是因为,我们需要使用字符串和索引进行连接。
所以我们可以像这个v模型一样

对于输入1

v-model="row.input[index+'-input1']"

对于输入2

v-model="row.input[index+'-input2']"

现在我们可以访问行输入了。
我们可以将它与disableddelete函数一起使用。
演示

相关问题