ভ্যু-অন: ক্লিক উপাদানগুলির সাথে কাজ করে না


186

আমি কোনও উপাদানটির ভিতরে ক্লিকের নির্দেশিকাটি ব্যবহার করার চেষ্টা করছি তবে এটি কার্যকর বলে মনে হচ্ছে না। আমি যখন কনসোলে একটি 'টেস্ট ক্লিক' করা উচিত তখন আমি উপাদানটি ক্লিক করি h আমি কনসোলে কোনও ত্রুটি দেখতে পাচ্ছি না, তাই আমি জানি না আমি কী ভুল করছি।

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>vuetest</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

App.vue

<template>
  <div id="app">
    <test v-on:click="testFunction"></test>
  </div>
</template>

<script>
import Test from './components/Test'

export default {
  name: 'app',
  methods: {
    testFunction: function (event) {
      console.log('test clicked')
    }
  },
  components: {
    Test
  }
}
</script>

পরীক্ষা.ভ্যু (উপাদান)

<template>
  <div>
    click here
  </div>
</template>

<script>
export default {
  name: 'test',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

উত্তর:


333

আপনি যদি কোনও উপাদানটির মূল উপাদানটিতে একটি নেটিভ ইভেন্ট শুনতে চান তবে আপনাকে নীচের মত । নেটিভ মডিফায়ার ব্যবহার করতে হবে v-on:

<template>
  <div id="app">
    <test v-on:click.native="testFunction"></test>
  </div>
</template>

বা সংক্ষিপ্তভাবে, মন্তব্যে প্রস্তাবিত হিসাবে, আপনি পাশাপাশি করতে পারেন:

<template>
  <div id="app">
    <test @click.native="testFunction"></test>
  </div>
</template>

3
বা শর্টহ্যান্ড@click.native="testFunction"
পিয়ের

75
একটি নেটিভ ইভেন্ট কী বা এটি অন্যান্য সাধারণ ইভেন্টের থেকে আলাদা কীভাবে ? মূল উপাদানগুলির জন্য কেন এই বিশেষ মামলা ???
মিঃক্লান


9
নেটিভ মডিফায়ারকে ফলস্বরূপ ব্যবহার করার পরামর্শ দেওয়া হয়। একেবারে প্রয়োজনে এটি ব্যবহার করুন। এটি অর্জন করার সঠিক উপায়ের জন্য @ জিম-ম্যাকনিলি দেখুন বাচ্চাদের উপাদান থেকে উত্সাহিত করা ইভেন্টগুলি এবং তারপরে পিতামাতায় পুনরুদ্ধার করুন।
ডিকনমি


32

আমি মনে $emitকরি আপনি যা চাইছেন তার জন্য ফাংশনটি আরও ভাল কাজ করে। এটি আপনার উপাদানটিকে ভ্যু উদাহরণ থেকে পৃথক করে রাখে যাতে এটি অনেক প্রসঙ্গে পুনরায় ব্যবহারযোগ্য।

// Child component
<template>
  <div id="app">
    <test @click="$emit('test-click')"></test>
  </div>
</template>

এটি এইচটিএমএল এ ব্যবহার করুন

// Parent component
<test @test-click="testFunction">

5
আমি এটিকে সঠিক উত্তর বলে বিশ্বাস করি। ইভেন্টগুলির সংযোগকারী উপাদানটির মধ্যে হ্যান্ডেল করুন। ক্লিক ইভেন্টের "সংস্করণ" কী কল করতে হবে তার পিতামাতার উপাদানটিকে উদ্বিগ্ন করবেন না। আমি প্রকৃতপক্ষে এটিকে উপাদানটির নীচের উত্তর হিসাবে বাস্তবায়িত করেছি এবং সেইভাবে @click="$emit('click')"পিতা-মাতার উপাদানটি নিয়মিত ব্যবহার করে@click
নেলসন রড্রিগেজ

2
আমি একটু বিভ্রান্ত $ এমিট অংশটি সম্ভবত পরীক্ষার উপাদান টেম্পলেটে থাকার কথা?
স্টিফান ফ্যাবিয়ান

1
@ নেলসন রডরিগেজ কী বলেছে। ব্যবহার@click="$emit('click')"
নিফেল

20

এটি @ নেপস'র উত্তর কিন্তু বিশদ সহ।


দ্রষ্টব্য : @ সৌরভের উত্তরটি আরও উপযুক্ত যদি আপনি নিজের উপাদানটি পরিবর্তন করতে না চান বা এতে অ্যাক্সেস না পান।


কেন ক্লিক ক্লিক শুধু কাজ করতে পারে না?

উপাদান জটিল। একটি উপাদান একটি ছোট অভিনব বোতামের মোড়ক হতে পারে, এবং অন্য একটি ভিতরে সম্পূর্ণ যুক্তিযুক্ত যুক্তি থাকতে পারে table নির্ভরযোগ্যতা জানে না যে আপনি কখন বেঁধে রাখবেন v-modelবা ব্যবহার করবেন তখন ঠিক কী কী তা v-onউপাদানগুলির স্রষ্টার দ্বারা প্রক্রিয়া করা উচিত।

ক্লিক ইভেন্ট হ্যান্ডেল কিভাবে

ভু ডক্স অনুসারে , $emitইভেন্টগুলি পিতামাতার কাছে প্রেরণ করে। দস্তাবেজ থেকে উদাহরণ:

প্রধান ফাইল

<blog-post
  @enlarge-text="onEnlargeText"
/>

উপাদান

<button @click="$emit('enlarge-text')">
  Enlarge text
</button>

(@ হয় v-on সাধারণভাবে সংক্ষেপে )

কম্পোনেন্টটি নেটিভ clickইভেন্ট পরিচালনা করে এবং পিতামাতাকে প্রকাশ করে@enlarge-text="..."

enlarge-textclickআমরা কোনও নেটিভ ক্লিক ইভেন্টটি পরিচালনা করছি এমন দেখতে এটির পরিবর্তে প্রতিস্থাপন করা যেতে পারে :

<blog-post
  @click="onEnlargeText"
></blog-post>
<button @click="$emit('click')">
  Enlarge text
</button>

কিন্তু এখানেই শেষ নয়. $emitএকটি ইভেন্টের সাথে একটি নির্দিষ্ট মান পাস করার অনুমতি দেয়। নেটিভ ক্ষেত্রেclickনেটিভের , মান হ'ল মাউসইভেন্ট (জেএস ইভেন্টের সাথে ভুয়ের সাথে কোনও সম্পর্ক নেই)।

ভ্যু সেই ইভেন্টটিকে একটি চলকতে সঞ্চয় করে $event। সুতরাং, $eventদেশীয় ইভেন্টের ব্যবহারের ছাপ তৈরির জন্য এটি একটি ইভেন্টের সাথে সবচেয়ে ভাল প্রকাশ করা উচিত :

<button v-on:click="$emit('click', $event)">
  Enlarge text
</button>

8

কিছুটা ভার্বোজ কিন্তু আমি এটি এটি করে:

@click="$emit('click', $event)"


8
এটা কোথায় যায়? ওখানে রেখেছিস কেন? লোকেরা এই উত্তরটি দেখার জন্য আরও কিছু বিশদ যুক্ত করুন, দয়া করে?
মিশ্র

এই উদাহরণে এটি টেস্ট.ভ্যু উপাদানটিতে ডিভ ট্যাগে স্থাপন করা হবে। তারপরে আপনি ভি-অন ব্যবহার করতে পারেন: অ্যাপ্লিকেশন-তে মান উপাদান পরীক্ষা করার সময় ক্লিক করুন "টেস্টফানশন" বা @ ক্লিক = "টেস্টফানশন"
টিম উইকস্ট্রোম

আমি এটিকে বদলেছি $emitকিন্তু কিছুই হচ্ছে না। আমি ছাড়াও কি কিছু করা দরকার $emit? jsfiddle.net/xwvhy6a3
রিচার্ড

@ রিচার্ড বারাক্লু আপনার উপাদান এখন আপনার কাস্টম ইভেন্টটি "ক্লিকট্রি আইটেম" নির্গত করে। ভি-করুন:: পরবর্তী কি যে উপাদান ব্যবহার যে ঘটনা সঙ্গে কাজ করতে হ্যান্ডেল হয় myEvent = "myMethod"
Neps

5

উপাদানগুলির নেটিভ ইভেন্টগুলি প্যারেন্ট উপাদানগুলির থেকে সরাসরি অ্যাক্সেসযোগ্য নয়। পরিবর্তে আপনার চেষ্টা করা উচিত v-on:click.native="testFunction", বা আপনি Testউপাদান থেকে একটি ইভেন্ট নির্গত করতে পারেন । ভালো লেগেছে v-on:click="$emit('click')"


4

ক্রিস ফ্রিটজ (Vue.js কোর টিম ইমেরিটি ) VueCONF ইউএস 2019 তে উল্লিখিত হিসাবে

যদি আমাদের কিয়া প্রবেশ করানো হয় .nativeএবং তারপরে বেস ইনপুটটির মূল উপাদানটি একটি ইনপুট থেকে একটি লেবেলে পরিবর্তিত হয়ে যায় হঠাৎ এই উপাদানটি ভেঙে যায় এবং এটি সুস্পষ্ট নয় এবং বাস্তবে, আপনি যদি সত্যিই ভাল পরীক্ষা না করেন তবে আপনি ঠিক এখনই এটি ধরতে পারবেন না। পরিবর্তে আমি বর্তমানে একটি অ্যান্টি-প্যাটার্নটিকে বিবেচনা করে যে .nativeপরিমার্জনকারীটিকে বিবেচনা করি তা ভ্যু 3 এ মুছে ফেলা হবে আপনি এটিকে পরিষ্কারভাবে ব্যাখ্যা করতে সক্ষম হবেন যে পিতামাতাকে যত্ন নিতে পারে যে কোন উপাদান শোনার সাথে যুক্ত হবে ...

ভ্যু 2 সহ

ব্যবহার $listeners :

সুতরাং, আপনি যদি এই সমস্যাটি সমাধানের জন্য ভ্যু 2 ব্যবহার করেন তবে এটি একটি সম্পূর্ণ স্বচ্ছ র্যাপার যুক্তি ব্যবহার করা। এর জন্য ভ্যু $listenersউপাদানটিতে শ্রোতার একটি উপাদান যুক্ত একটি সম্পত্তি সরবরাহ করে । উদাহরণ স্বরূপ:

{
  focus: function (event) { /* ... */ }
  input: function (value) { /* ... */ },
}

এবং তারপরে আমাদের কেবলমাত্র উপাদানটি যুক্ত v-on="$listeners"করতে হবে test:

পরীক্ষা.ভ্যু (শিশু উপাদান)

<template>
  <div v-on="$listeners">
    click here
  </div>
</template>

এখন <test>উপাদানটি একটি সম্পূর্ণ স্বচ্ছ র্যাপার , এর অর্থ এটি সাধারণ <div>উপাদানটির মতোই ব্যবহার করা যেতে পারে : সমস্ত শ্রোতা .nativeসংশোধক ছাড়াই কাজ করবে ।

ডেমো:

Vue.component('test', {
  template: `
    <div class="child" v-on="$listeners">
      Click here
    </div>`
})

new Vue({
  el: "#myApp",
  data: {},
  methods: {
    testFunction: function(event) {
      console.log('test clicked')
    }
  }
})
div.child{border:5px dotted orange; padding:20px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="myApp">
  <test @click="testFunction"></test>
</div>

$emitপদ্ধতি ব্যবহার :

আমরা $emitএই উদ্দেশ্যেও পদ্ধতিটি ব্যবহার করতে পারি , যা আমাদের প্যারেন্ট উপাদানগুলির মধ্যে শিশুদের ইভেন্টগুলি শুনতে সহায়তা করে। এর জন্য, আমাদের সবার আগে শিশু উপাদান থেকে একটি কাস্টম ইভেন্ট নির্গত করতে হবে :

পরীক্ষা.ভ্যু (শিশু উপাদান)

<test @click="$emit('my-event')"></test>

গুরুত্বপূর্ণ: ইভেন্টের নামের জন্য সর্বদা কাবাব-কেস ব্যবহার করুন। আরও তথ্যের জন্য এবং ডেমোটি এই পয়েন্টটিতে রেজিস্ট্রেশন করার জন্য দয়া করে এই উত্তরটি দেখুন: ভ্যুজেএস উপাদান থেকে পিতামাতার কাছে গণিত মান পাস করছে

এখন, আমাদের কেবল পিতামাতার উপাদানগুলিতে এই নির্গত কাস্টম ইভেন্টটি শুনতে হবে:

App.vue

<test @my-event="testFunction"></test>

সুতরাং, মূলত পরিবর্তে v-on:clickবা শর্টহ্যান্ড @clickআমরা কেবল v-on:my-eventবা কেবল ব্যবহার করব @my-event

ডেমো:

Vue.component('test', {
  template: `
    <div class="child" @click="$emit('my-event')">
      Click here
    </div>`
})

new Vue({
  el: "#myApp",
  data: {},
  methods: {
    testFunction: function(event) {
      console.log('test clicked')
    }
  }
})
div.child{border:5px dotted orange; padding:20px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="myApp">
  <test @my-event="testFunction"></test>
</div>


ভ্যু 3 সহ

ব্যবহার v-bind="$attrs" :

ভ্যু 3 আমাদের জীবনকে বিভিন্ন উপায়ে আরও সহজ করে তুলছে। এর উদাহরণগুলির মধ্যে একটি হ'ল এটি আমাদের ব্যবহার করে খুব কম কনফিগারেশন সহ একটি সহজ স্বচ্ছ র্যাপার তৈরি করতে সহায়তা করবে v-bind="$attrs"। এটি শিশু উপাদানগুলিতে ব্যবহার করে আমাদের শ্রোতা কেবল পিতামাতার সরাসরি কাজ করবে না তবে অন্য কোনও বৈশিষ্ট্যও এটি স্বাভাবিকের মতো কাজ করবে<div>

সুতরাং, এই প্রশ্নের প্রসঙ্গে, আমাদের ভ্যূ 3 এ কোনও আপডেট করার দরকার নেই এবং আপনার কোডটি <div>এখানে মূল উপাদান হিসাবে ঠিকঠাকভাবে কাজ করবে এবং এটি স্বয়ংক্রিয়ভাবে সমস্ত শিশুর ইভেন্ট শুনবে।

ডেমো # 1:

const { createApp } = Vue;

const Test = {
  template: `
    <div class="child">
      Click here
    </div>`
};

const App = {
  components: { Test },
  setup() {
    const testFunction = event => {
      console.log("test clicked");
    };
    return { testFunction };
  }
};

createApp(App).mount("#myApp");
div.child{border:5px dotted orange; padding:20px;}
<script src="//unpkg.com/vue@next"></script>
<div id="myApp">
  <test v-on:click="testFunction"></test>
</div>

তবে নেস্টেড উপাদানযুক্ত জটিল উপাদানগুলির জন্য যেখানে আমরা <input />কেবলমাত্র ব্যবহার করতে পারি তার জন্য প্যারেন্ট লেবেলের পরিবর্তে প্রধানত বৈশিষ্ট্য এবং ইভেন্টগুলি প্রয়োগ করতে হবেv-bind="$attrs"

ডেমো # 2:

const { createApp } = Vue;

const BaseInput = {
  props: ['label', 'value'],
  template: `
    <label>
      {{ label }}
      <input v-bind="$attrs">
    </label>`
};

const App = {
  components: { BaseInput },
  setup() {
    const search = event => {
      console.clear();
      console.log("Searching...", event.target.value);
    };
    return { search };
  }
};

createApp(App).mount("#myApp");
input{padding:8px;}
<script src="//unpkg.com/vue@next"></script>
<div id="myApp">
  <base-input 
    label="Search: "
    placeholder="Search"
    @keyup="search">
  </base-input><br/>
</div>


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ধন্যবাদ!
অ্যালিজুনিয়র

0

ডকুমেন্টেশন থেকে :

জাভাস্ক্রিপ্টে সীমাবদ্ধতার কারণে, ভ্যূ অ্যারেতে নিম্নলিখিত পরিবর্তনগুলি সনাক্ত করতে পারে না:

  1. আপনি যখন সূচক সহ সরাসরি কোনও আইটেম সেট করেন, যেমন vm.items [indexOfItem] = newValue
  2. আপনি যখন অ্যারের দৈর্ঘ্যটি পরিবর্তন করেন, যেমন vm.items.length = newLength th

আমার ক্ষেত্রে অ্যাংুলার থেকে ভিইউতে স্থানান্তরিত করার সময় আমি এই সমস্যায় হোঁচট খেয়েছি। ফিক্সটি বেশ সহজ ছিল, তবে এটি খুঁজে পাওয়া সত্যিই কঠিন:

setValue(index) {
    Vue.set(this.arr, index, !this.arr[index]);
    this.$forceUpdate(); // Needed to force view rerendering
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.