Vue.js গতিশীল চিত্রগুলি কাজ করছে না


99

আমি একটি মামলা যেখানে আমার আছে Vue.jsসঙ্গে webpackওয়েব অ্যাপ্লিকেশন, আমি গতিশীল চিত্রগুলি প্রদর্শনের জন্য প্রয়োজন। আমি imgচিত্রগুলির ফাইলের নামটি একটি ভেরিয়েবলে কোথায় সঞ্চয় করা আছে তা দেখাতে চাই । সেই পরিবর্তনশীল হ'ল এমন computedসম্পত্তি যা কোনও Vuexস্টোর ভেরিয়েবল ফিরিয়ে দেয় , যা অবিচ্ছিন্নভাবে পপুলেশন করা হচ্ছে beforeMount

<div class="col-lg-2" v-for="pic in pics">
   <img v-bind:src="'../assets/' + pic + '.png'" v-bind:alt="pic">
</div>

যাইহোক এটি ঠিকভাবে কাজ করে যখন আমি ঠিক করি:

<img src="../assets/dog.png" alt="dog">

আমার কেস এই ঝাঁকুনির সাথে সমান , তবে এখানে এটি আইএমজি ইউআরএল নিয়ে কাজ করে তবে প্রকৃত ফাইল পাথের সাথে এটি কাজ করে না।

এটি করার সঠিক উপায়টি কী হওয়া উচিত?


4
সমাধান করা `<ভি- @/assets/ইমগ: এসসিআর =" প্রয়োজন ( + আইটেম.ইমজেজ) "উচ্চতা =" 200px "> </v-img> one এটিও সমস্যার সমাধান করেছে
মোহাম্মদ রাজা

উত্তর:


104

আমি কোড অনুসরণ করে এই কাজ পেয়েছি

  getImgUrl(pet) {
    var images = require.context('../assets/', false, /\.png$/)
    return images('./' + pet + ".png")
  }

এবং এইচটিএমএলে:

<div class="col-lg-2" v-for="pic in pics">
   <img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>

তবে নিশ্চিত না কেন আমার আগের পদ্ধতির কাজ হয়নি not


7
নিকমেসিং-এর মতে: "ভি-বাইন্ডের ভিতরে থাকা এক্সপ্রেশনটি রানটাইম সময়ে কার্যকর করা হয়, সংকলনের সময় ওয়েবপ্যাকের উপকরণ" " github.com/vuejs/vue-loader/issues/896
Antoine

@Grigio এই উত্তরটি একটা চমৎকার বর্ধিতকরণ রয়েছে: stackoverflow.com/a/47480286/5948587
samlandfried

4
সমস্যাটি ছিল যে পথটির অস্তিত্ব নেই। পুরো ভ্যু অ্যাপটি ওয়েবপ্যাক দ্বারা একটি একক স্ক্রিপ্টে সংকলিত হয় (এবং সামগ্রীর একটি হ্যাশ ব্যবহার করে চিত্রগুলিও সাধারণত নামকরণ করা হয়)। প্রযোজনীয় কোডটেক্সট ব্যবহার করে আপনি ফাইলগুলি ওয়েবপ্যাকের দ্বারা দেখতে বাধ্য হন এবং ফলাফলের চিত্রটি সমাধান করেন। ব্রাউজারে কাজের লিঙ্কটি পরীক্ষা করে দেখুন এবং আমি কী বলতে চাইছি তা দেখতে পাবেন। দুর্দান্ত সমাধান।
এস্তানি

আমি যদি চাই না যে আমার চিত্রগুলি সম্পদ ফোল্ডারে থাকুক? তারা যদি প্রশাসনের ক্ষেত্রের ব্যবহারকারীদের দ্বারা আপলোড হওয়ার কারণে কেবল ওয়েবসাইটের পাবলিক ফোল্ডারে উপস্থিত থাকে?
থিনসোল্ডার

হ্যালো, আমি এটি চেষ্টা করেছি কিন্তু ব্যর্থ হয়েছি, তারপরে আমি আরও একটি সমাধান পেয়েছি যা টেম্পলেট আক্ষরিক ব্যবহার করে। এটি কাজ করতে পারে এবং আমি এটি ভাগ করতে চাই: stackoverflow.com/questions/57349167/…
লিন

86

এখানে একটি শর্টহ্যান্ড যা ওয়েবপ্যাকটি ব্যবহার করবে যাতে আপনার ব্যবহার করতে হবে না require.context

এইচটিএমএল:

<div class="col-lg-2" v-for="pic in pics">
    <img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>

মান পদ্ধতি:

getImgUrl(pic) {
    return require('../assets/'+pic)
}

আর আমি যে প্রথম 2 অনুচ্ছেদ এটি এখানে ব্যাখ্যা কেন এই কাজ? আমরা হব.

দয়া করে মনে রাখবেন যে আপনার পোষা প্রাণীর ছবিগুলি আপনার অন্য সমস্ত চিত্রের সম্পদের সাথে লবিং না করে সাব-ডিরেক্টরিতে রেখে দেওয়া ভাল ধারণা। তাই ভালো:./assets/pets/


v <ভি- @/assets/ইমগ: এসসিআর = "প্রয়োজন ( + আইটেম.ইমজ)" উচ্চতা = "200 পিক্স"> </v-img> one এটি সমস্যার সমাধানও করেছে
মোহাম্মদ রাজা

অনেক চেষ্টা করার পরে এটিই ছিল একমাত্র কার্যকরী সমাধান ..
মাক্কাস

45

আপনি requireফাংশন চেষ্টা করতে পারেন । এটার মত:

<img :src="require(`@/xxx/${name}.png`)" alt class="icon" />

কেন এই @প্রতীক প্রয়োজন?
ক্ষতি করুন

4
@প্রতীক প্রয়োজন হয় না, এটি সমাধান করুন |src ব্যবহার করার সময় এটি আপনার দিরকে উপস্থাপন করে ওয়েবপ্যাক ( ভ্যু - ক্লিপ ইতিমধ্যে এটি কনফিগার করা আছে))
ফেং ঝ্যাং

21

সম্পদের পরিবর্তে আপনার ইমেজ ফাইলগুলি সর্বজনীন ফোল্ডারে যুক্ত করার এবং স্ট্যাটিক চিত্র হিসাবে অ্যাক্সেস করার আরও একটি উপায় রয়েছে।

<img :src="'/img/' + pic + '.png'" v-bind:alt="pic" >

এই স্থানে আপনাকে আপনার স্থির চিত্রগুলি রাখা দরকার:

এখানে চিত্র বর্ণনা লিখুন


এটি আমার জন্য
বেস্ট

4
আমাকে প্রচুর ব্যথা বাঁচিয়েছে, আমি আশ্চর্যজনক ত্রুটি পেয়েছি: প্রয়োজনীয় ব্যবহার করে মডিউলটি '। / সংজ্ঞায়িত' খুঁজে পাচ্ছি না, ধন্যবাদ
দ্রাক্কার

4
আমি মনে করি এটি যাওয়ার উপায়, সম্পদ ফোল্ডারটি নয়।
জেন্ডেন্ডুট

4
গতিশীল প্রয়োজন আমার জন্য সর্বশেষতম ভ্যু 2
তেও কাজ

8

আপনার সেরা বাজি হ'ল প্রদত্ত সূচকে চিত্রের জন্য সঠিক স্ট্রিংটি তৈরি করতে কেবল একটি সহজ পদ্ধতি ব্যবহার করা:

methods: {
  getPic(index) {
    return '../assets/' + this.pics[index] + '.png';
  }
}

তারপরে আপনার ভিতরে নিম্নলিখিতটি করুন v-for:

<div class="col-lg-2" v-for="(pic, index) in pics">
   <img :src="getPic(index)" v-bind:alt="pic">
</div>

এখানে জেএসফিডেল (স্পষ্টতই চিত্রগুলি দেখায় না, তাই আমি চিত্রটি ইমেজের srcপাশে রেখেছি ):

https://jsfiddle.net/q2rzssxr/


সত্যি? এখানে বাস্তব চিত্রগুলির উদাহরণ রয়েছে যা ভাল কাজ করে বলে মনে হচ্ছে: jsfiddle.net/q2rzssxr/1
ক্রেগ_h

নিশ্চিত নয় কেন, আমি অন্য উত্তরে যে কোডটি লিখেছি তা এটি পেয়ে কাজ করে। আপনি উদাহরণস্বরূপ এমনকি এই ফাংশনটি ছাড়াও কাজ করেন, এখানে দেখুন: jsfiddle.net/9a6Lg2vd/1
সৌরভ

আমার ক্ষেত্রে, ছবিগুলি ভিউক্স স্টোরটি অবিচ্ছিন্নভাবে ব্যবহার করা হচ্ছে, এটি সম্পর্কে কিছু করার থাকতে পারে, আমি এটি অনুকরণ করার চেষ্টা করেছি, তবে কাজ করে নি: jsfiddle.net/9a6Lg2vd/2
সৌরভ

আমার কেসটি আরও এর মতো: jsfiddle.net/9a6Lg2vd/4 , তবে আমার স্থানীয় পোষা প্রাণীগুলিতে একটি অজ্যাক্স কল থেকে ডেটা পপুলেটে আসে , তবে চিত্রগুলি রেন্ডার পায় না।
সৌরভ

এটিও কাজ করে: jsfiddle.net/9a6Lg2vd/5 , কেন এটি ফাইল পাথের সাথে কাজ করছে না তা নিশ্চিত নয়।
সৌরভ

6

আমি এই সমস্যাটিকেও আঘাত করেছি এবং দেখে মনে হচ্ছে উভয় সর্বাধিক উত্সাহিত উত্তরগুলি কাজ করে তবে একটি ক্ষুদ্র সমস্যা রয়েছে, ওয়েবপ্যাক ব্রাউজার কনসোলে একটি ত্রুটি নিক্ষেপ করে (ত্রুটি: ওয়েবপ্যাককন্টেক্সট্রেসলভে মডিউল '। / সংজ্ঞায়িত' খুঁজে পাচ্ছে না) যা খুব সুন্দর নয়।

তাই আমি এটিকে কিছুটা আলাদাভাবে সমাধান করেছি। ভেরিয়েবলের অভ্যন্তরের পুরো সমস্যাটি হ'ল বিবৃতিটির প্রয়োজন বান্ডিলিংয়ের সময় বিবৃতি কার্যকর করা হয় এবং বিবৃতিটির ভিতরে পরিবর্তনশীল কেবল ব্রাউজারে অ্যাপ প্রয়োগের সময় উপস্থিত হয়। সুতরাং ওয়েবপ্যাক প্রয়োজনীয় চিত্রটিকে অপরিজ্ঞাত হিসাবে দেখায় যেমন সংকলনের সময় যে ভেরিয়েবলের অস্তিত্ব নেই।

আমি যা করেছি তা হল এলোমেলো চিত্রের বিবরণী রাখা এবং সেই চিত্রটি সিএসএসে লুকিয়ে রাখা, সুতরাং কেউ এটিকে দেখেনি।

// template
<img class="user-image-svg" :class="[this.hidden? 'hidden' : '']" :src="userAvatar" alt />

//js
data() {
  return {
    userAvatar: require('@/assets/avatar1.svg'),
    hidden: true
  }
}

//css
.hidden {display: none}

চিত্র ভয়েক্সের মাধ্যমে ডেটাবেস থেকে প্রাপ্ত তথ্যের অংশ হিসাবে আসে এবং একটি গণন হিসাবে উপাদানগুলিতে ম্যাপ করা হয়

computed: {
  user() {
    return this.$store.state.auth.user;
  }
}

সুতরাং একবার এই তথ্যটি পাওয়া গেলে আমি প্রাথমিক চিত্রটি আসলটির সাথে বদলে যাই

watch: {
  user(userData) {
    this.userAvatar = require(`@/assets/${userData.avatar}`);
    this.hidden = false;
  }
}

4

এখানে খুব সহজ উত্তর। : ডি

<div class="col-lg-2" v-for="pic in pics">
   <img :src="`../assets/${pic}.png`" :alt="pic">
</div>

3

পাওয়া যায়নি এমন চিত্রগুলির সাহায্যে আপনি ক্যাপ ব্লক ব্যবহার করতে পারেন

getProductImage(id) {
          var images = require.context('@/assets/', false, /\.jpg$/)
          let productImage = ''
          try {
            productImage = images(`./product${id}.jpg`)
          } catch (error) {
            productImage = images(`./no_image.jpg`)
          }
          return productImage
},

2
<img src="../assets/graph_selected.svg"/>

স্থির পথটি ওয়েব প্যাকের মাধ্যমে লোডার মাধ্যমে মডিউল নির্ভরতা হিসাবে সমাধান করা হয়। তবে গতিশীল পাথের জন্য আপনাকে পাথটি সমাধানের জন্য প্রয়োজন। তারপরে আপনি বুলিয়ান ভেরিয়েবল এবং টের্নারি এক্সপ্রেশন ব্যবহার করে চিত্রগুলির মধ্যে স্যুইচ করতে পারেন।

<img :src="this.graph ? require( `../assets/graph_selected.svg`) 
: require( `../assets/graph_unselected.svg`) " alt="">

এবং অবশ্যই কিছু ইভেন্ট হ্যান্ডলারের মাধ্যমে বুলিয়ানের মান টগল করুন।


আপনাকে ধন্যবাদ এই কাজ :src="require(../assets/category_avatar/baby_kids.jpeg)"
মোহাম্মদ রাজা

2

Vue.js ব্যবহার করে vue-loader, ওয়েবপ্যাকের জন্য একটি লোডার যা সংকলনকালে পাথগুলি পুনরায় লেখার / রূপান্তর করার জন্য সেট আপ করা হয়েছে, যাতে আপনাকে স্থিতিশীল পাথগুলি সম্পর্কে উদ্বিগ্ন হতে না পারে যা মোতায়েনের মধ্যে পৃথক হবে (স্থানীয়, দেব, একটি হোস্টিং প্ল্যাটফর্ম বা অন্য) , আপনাকে আপেক্ষিক স্থানীয় ফাইল সিস্টেমের পাথগুলি ব্যবহার করার অনুমতি দিয়ে । এটি অন্যান্য সুবিধাগুলি যেমন সম্পদ ক্যাচিং এবং সংস্করণ যুক্ত করে (আপনি সম্ভবত প্রকৃত srcURL তৈরি হচ্ছে তা পরীক্ষা করে দেখতে পারেন )।

সুতরাং এমন একটি সিআরসি থাকা যা সাধারণত পরিচালনা করে vue-loader সিআরসি থাকা / ওয়েবপ্যাক গতিশীল এক্সপ্রেশন হিসাবে সেট করা, রানটাইমের সময় মূল্যায়ন করা, এই প্রক্রিয়াটি নিস্ক্রিয় করবে এবং উত্পন্ন ডায়নামিক ইউআরএল প্রকৃত স্থাপনার প্রসঙ্গে অবৈধ হবে (এটি সম্পূর্ণরূপে যোগ্য না হলে এটি ব্যতিক্রম) )।

পরিবর্তে, আপনি requireগতিশীল অভিব্যক্তিতে একটি ফাংশন কল ব্যবহার করবেন , vue-loader/ ওয়েবপ্যাক এটি দেখতে পাবেন এবং সাধারণ যাদুটি প্রয়োগ করবেন।

উদাহরণস্বরূপ, এটি কাজ করবে না:

<img alt="Logo" :src="logo" />
computed: {
    logo() {
        return this.colorMode === 'dark'
               ? './assets/logo-dark.png'
               : './assets/logo-white.png';
    }
}

যদিও এটি কাজ করবে:

<img alt="Logo" :src="logo" />
computed: {
    logo() {
        return this.colorMode === 'dark'
               ? require('./assets/logo-dark.png')
               : require('./assets/logo-white.png');
    }
}

আমি নিজেই এই সম্পর্কে জানতে পেরেছি। আমাকে এক ঘন্টা সময় নিয়েছে কিন্তু ... তুমি বেঁচে আছ, তুমি শিখো, তাই না? 😊


0

আমার পক্ষে সবচেয়ে ভাল ও সহজ উপায়টি হ'ল আমি এপিআই থেকে ডেটা আনছিলাম ..

methods: {
       getPic(index) {
    return this.data_response.user_Image_path + index;
  }
 }

getPic পদ্ধতিতে একটি প্যারামিটার লাগে যা ফাইলটির নাম এবং এটি ফাইলের পরম পথটি ফাইলের নাম সহ আপনার সার্ভার থেকে ফেরত দেয় ...

আমি এখানে এটি ব্যবহার করেছি এমন একটি উপাদানটির উদাহরণ এখানে দেওয়া হয়েছে:

<template>
    <div class="view-post">
        <div class="container">
     <div class="form-group">
             <label for=""></label>
             <input type="text" class="form-control" name="" id="" aria-describedby="helpId" placeholder="search here">
             <small id="helpId" class="form-text user-search text-muted">search for a user here</small>
           </div>
           <table class="table table-striped ">
               <thead>
                   <tr>
                       <th>name</th>
                       <th>email</th>
                       <th>age</th>
                       <th>photo</th>
                   </tr>
                   </thead>
                   <tbody>
                       <tr v-bind:key="user_data_get.id"  v-for="user_data_get in data_response.data">
                           <td scope="row">{{ user_data_get.username }}</td>
                           <td>{{ user_data_get.email }}</td>
                           <td>{{ user_data_get.userage }}</td>
                           <td><img :src="getPic(user_data_get.image)"  clas="img_resize" style="height:50px;width:50px;"/></td>
                       </tr>

                   </tbody>
           </table>
        </div>

    </div>
</template>

<script>
import axios from 'axios';
export default {
     name: 'view',
  components: {

  },
  props:["url"],
 data() {
     return {
         data_response:"",
         image_path:"",
     }
 },
 methods: {
       getPic(index) {
    return this.data_response.user_Image_path + index;
  }
 },
 created() {
     const res_data = axios({
    method: 'post',
    url: this.url.link+"/view",
   headers:{
     'Authorization': this.url.headers.Authorization,
     'content-type':this.url.headers.type,
   }
    })
    .then((response)=> {
        //handle success
      this.data_response = response.data;
      this.image_path = this.data_response.user_Image_path;
       console.log(this.data_response.data)
    })
    .catch(function (response) {
        //handle error
        console.log(response);
    });
 },
}
</script>


<style scoped>

</style>

0

আমিও একই সমস্যার মুখোমুখি হয়েছি। এটি আমার জন্য '../assets/' থেকে './assets/' পরিবর্তন করে কাজ করেছে।

 <img v-bind:src="'./assets/' + pic + '.png'" v-bind:alt="pic">

0

এখানে সমস্ত উত্তর চেষ্টা করেছিলাম তবে ভ্যু 2 এ আমার জন্য যা কাজ করেছে তা এই জাতীয়।

<div class="col-lg-2" v-for="pic in pics">
   <img :src="require(`../assets/${pic.imagePath}.png`)" :alt="pic.picName">
</div>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.