在下面的这个vue示例中,我试图仅使用vue从外部js文件中加载“ images”数组。 我尝试了与此帖子类似的内容: How do I access data from an external file in Vue.js please? 但这对我来说并不是很有效(很可能是因为我做错了明显的事情)。非常感谢您提供任何有关如何使其正常工作的建议。
我为您创建了一个codePen,以防您喜欢这样看。谢谢! https://codepen.io/FloydGekko/pen/eLoRBQ
<head>
<style>
[v-cloak] {
display: none;
}
.imageBlock{
width:100%;
margin:10px;
}
div.polaroid {
width:310px;
height:440px;
margin:10px;
background-color: white;
box-shadow: 6px 4px 8px 0 rgba(0, 0, 0, 0.2), 6px 6px 20px 0 rgba(0, 0, 0, 0.19);
margin-bottom: 25px;
border-radius: 18px
}
div.container {
text-align: center;
padding: 10px 20px;
}
</style>
</head>
<body>
<div id="vue" v-cloak>
<h2 align="center">
Show
<select v-model="currentKind" @change="onChange">
<option v-for="kind, index in kinds" :value="kind" :key="`kind_${index}`">{{kind ? kind : 'kind...'}}</option>
</select>
<select v-model="currentColor" @change="onChange">
<option v-for="color, index in colors" :value="color" :key="`kind_${index}`">{{color ? color : 'color...'}}</option>
</select>
and
<select v-model="currentShape" @change="onChange">
<option v-for="shape, index in shapes" :value="shape" :key="`kind_${index}`">{{shape ? shape : 'shape...'}}</option>
</select>
</h2>
<isotope
id="root_isotope"
ref="isotope"
:options='options'
:list="images"
align="center">
<div class="polaroid" align="center"
v-for="(image, index) in images"
class="imageBlock"
:key="image.id">
<a target="_blank" :href="image.url"><img border="0" :src="image.pic" alt=""
style="
border-radius: 20px;
display: block;
margin-left: auto;
margin-right: auto;
width: 100%;">
</a>
<div class="container">
<a target="_blank" :href="image.url">
<h3 align="center">{{image.title}}</h3>
</a>
</div>
</div>
</isotope>
<h2 align="center">
<button @click="reset">Show all</button>
</h2>
</div>
<script src='https://unpkg.com/vue/dist/vue.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js'></script>
<script src='https://npmcdn.com/isotope-layout@3.0.6/dist/isotope.pkgd.min.js'></script>
<script src='https://rawgit.com/David-Desmaisons/Vue.Isotope/master/src/vue_isotope.js'></script>
<script>
let currentKind = null;
let currentColor = null;
let currentShape = null;
var vm = new Vue({
el: '#vue',
data() {
return {
currentKind:'',
currentColor:'',
currentShape:'',
options: {
itemSelector: ".imageBlock",
getSortData: {
id: "id"
},
sortBy : "id",
getFilterData: {
Finder: function(itemElem) {
let kindSearch = currentKind ? itemElem.kind.indexOf(currentKind) !== -1 : true;
let colorSearch = currentColor ? itemElem.color.indexOf(currentColor) !== -1 : true;
let shapeSearch = currentShape ? itemElem.shape.indexOf(currentShape) !== -1 : true;
return kindSearch && colorSearch && shapeSearch
},
},
},
//THIS IS THE ARRAY IM TRYING TO LOAD FROM AN EXTERNAL FILE
images: [
{
id: 1,
kind: ['A'],
color: ['Green', 'Blue'],
shape: ['Square'],
pic: 'http://r.ddmcdn.com/s_f/o_1/cx_462/cy_245/cw_1349/ch_1349/w_720/APL/uploads/2015/06/caturday-shutterstock_149320799.jpg',
url: 'http://r.ddmcdn.com/s_f/o_1/cx_462/cy_245/cw_1349/ch_1349/w_720/APL/uploads/2015/06/caturday-shutterstock_149320799.jpg',
title: 'A',
},
{
id: 2,
kind: ['B'],
color: ['Green', 'Red'],
shape: ['Circle'],
pic: 'https://www.kimballstock.com/pix/DOG/05/DOG-05-JE0078-01P.JPG',
url: 'https://www.kimballstock.com/pix/DOG/05/DOG-05-JE0078-01P.JPG',
title: 'B',
},
],
};
},
computed: {
kinds(){
let allTags = _.flatten(this.images.map(image => image.kind))
return [''].concat(_.uniq(allTags))
},
colors(){
let allTags = _.flatten(this.images.map(image => image.color))
return [''].concat(_.uniq(allTags))
},
shapes(){
let allTags = _.flatten(this.images.map(image => image.shape))
return [''].concat(_.uniq(allTags))
},
},
methods: {
onChange: function() {
currentColor = this.currentColor;
currentShape = this.currentShape;
currentKind = this.currentKind;
this.$refs.isotope.filter('Finder');
this.$refs.cpt.layout('packery');
},
reset(){
currentColor = '';
currentShape = '';
currentKind = '';
this.currentColor = '';
this.currentShape = '';
this.currentKind = '';
this.onChange()
}
},
});
</script>
</body>
</html>
答案 0 :(得分:0)
这实际上取决于“外部”的含义和“仅Vue”的含义。如果您可以控制数据,数据的结构和位置,则可以执行@softbear所做的事情-只需import
项目内的javascript文件即可。您可以根据设置以多种方式执行此操作。他的例子包括
<script src="images.js"></script>
将类似的内容导出
window.images = [{ 'array of images': 'goes here'}]
如果您使用的是Vue,则应该能够使用引导项目,并直接从源文件中导入它。
您可以有一个提供相同结果的后端,并且导入脚本时浏览器会自动加载它。
有很多方法,但是结果是相同的。这里最重要的是,此文件必须declare
您的变量,以后应使用。
上面的方法几乎没有问题:您无法完全控制何时开始加载数据,也没有完全控制何时加载数据(有多种方法可以做到,但是更难,更难看);某些跨域服务不允许您直接执行js代码-它们只能提供数据。
这意味着,如果最终遇到这种情况(例如,连接到动态数据集而不是硬编码集),最好提出请求以加载此数据。基本上是手动执行浏览器可以为您完成的工作。但是通过这种方式,您可以完全(轻松)地控制何时以及如何完成此操作。
再次有很多方法-如果您在现代浏览器中使用最新的JS,则可以使用fetch API,或使用某些外部工具,例如axios。
尽管第二种方法可能会给您的项目增加其他依赖性,但我还是会投票支持。