一般来说,我是前端的新手,尤其是vue.js。我试图制作一个包含5个元素的小型应用程序,每个元素实际上是从具有2个值的对象(名称和描述)中获取数据。同样,每个对象都在数组中。
默认情况下,名称显示为阻止,默认情况下,描述显示为无。 我希望应用程序在单击名称时显示阻止描述的内容。 这是完整的代码,您可以在Codepen上或在本地运行它,它将毫无问题地运行。您可以忽略body标签上方的所有内容。
<html>
<head>
<style>
*{margin: 0px; padding: 0px; font-family: sans-serif; list-style-type: none; }
body{background: #003366;}
#container{width: 1000px; margin: 100px auto;}
#elements{width: 100%;}
#elements li{display: inline-block; width: 40%; margin: 40px 5%; background: #FFF; color: #003366; box-shadow: 10px 10px 0px #222; user-select: none;}
#elements li h1,h3{padding: 10px 20px;}
#elements li h3{display: none;}
#elements li h1{cursor: pointer;}
</style>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
<div id="container">
<ul id='elements'>
<li v-for="eleObject in eleObjects">
<h1 v-on:click="expand" v-text="eleObject.name"></h1>
<h3 v-text="eleObject.description"></h3>
</li>
</ul>
</div>
</body>
<script>
let elementList = new Vue({
el: "#elements",
data:{
eleObjects:[
{name: "HTML5", description: "Used for front end web development more specifically for building the structure of a website"},
{name: "CSS3", description: "Used for giving style to the HTML elements, their positioning and overall look of the website"},
{name: "JavaScript 2015", description: "Used for event handling, functionality and dynamics of the website"},
{name: "Vue JS", description: "JavaScript framework for component based programming which is used to create more dynamic websites"},
{name: "Django.py", description: "Python framewrok used for the backend of the website aka storing data, displaying data templates etc..."}
]
},
methods:{
expand: function(){
}
}
});
</script>
</html>
答案 0 :(得分:1)
要获得所需的行为,最好在对象上具有一些属性,以指示事物是否可见。
eleObjects:[
{name: "HTML5", description: "Used for front end web development more specifically for building the structure of a website", visible: false},
{name: "CSS3", description: "Used for giving style to the HTML elements, their positioning and overall look of the website", visible: false},
{name: "JavaScript 2015", description: "Used for event handling, functionality and dynamics of the website", visible: false},
{name: "Vue JS", description: "JavaScript framework for component based programming which is used to create more dynamic websites", visible: false},
{name: "Django.py", description: "Python framewrok used for the backend of the website aka storing data, displaying data templates etc...", visible: false}
]
从v-for
循环中可以获取索引,并将相同的索引传递给expand
函数,因此您可以从方法中访问单击的元素。
<li v-for="(eleObject, index) in eleObjects">
<h1 @click="expand(index)" v-text="eleObject.name"></h1>
<h3 v-show="eleObject.visible" v-text="eleObject.description"></h3>
</li>
expand
方法应该简单易懂,我们只想更新单击元素的visible
状态。
expand: function(index){
this.eleObjects[index].visible = !this.eleObjects[index].visible;
}
答案 1 :(得分:0)
在mounted
钩中,您需要通过添加名为eleObjects
的新字段来更改show
数组项,该字段最初为false
,并且您可以使用{{1 }},那么当您单击特定项目时,它将展开
v-show
let elementList = new Vue({
el: "#elements",
data: {
eleObjects: [{
name: "HTML5",
description: "Used for front end web development more specifically for building the structure of a website"
},
{
name: "CSS3",
description: "Used for giving style to the HTML elements, their positioning and overall look of the website"
},
{
name: "JavaScript 2015",
description: "Used for event handling, functionality and dynamics of the website"
},
{
name: "Vue JS",
description: "JavaScript framework for component based programming which is used to create more dynamic websites"
},
{
name: "Django.py",
description: "Python framewrok used for the backend of the website aka storing data, displaying data templates etc..."
}
]
},
methods: {
expand: function(el, i) {
el.show = true;
this.$set(this.eleObjects, i, el);
}
},
mounted() {
this.eleObjects = this.eleObjects.map(e => {
let t = e;
e.show = false;
return t;
});
}
});
* {
margin: 0px;
padding: 0px;
font-family: sans-serif;
list-style-type: none;
}
body {
background: #003366;
}
#container {
width: 1000px;
margin: 100px auto;
}
#elements {
width: 100%;
}
#elements li {
display: inline-block;
width: 40%;
margin: 40px 5%;
background: #FFF;
color: #003366;
box-shadow: 10px 10px 0px #222;
user-select: none;
}
#elements li h1,
h3 {
padding: 10px 20px;
}
#elements li h3 {}
#elements li h1 {
cursor: pointer;
}
答案 2 :(得分:0)
如您在其他答案中所读,您可以添加属性以查看其是否可见。
另一种方法是,您可以检查CSS并根据block
或none
let elementList = new Vue({
el: "#elements",
data: {
eleObjects: [{
name: "HTML5",
description: "Used for front end web development more specifically for building the structure of a website"
},
{
name: "CSS3",
description: "Used for giving style to the HTML elements, their positioning and overall look of the website"
},
{
name: "JavaScript 2015",
description: "Used for event handling, functionality and dynamics of the website"
},
{
name: "Vue JS",
description: "JavaScript framework for component based programming which is used to create more dynamic websites"
},
{
name: "Django.py",
description: "Python framewrok used for the backend of the website aka storing data, displaying data templates etc..."
}
]
},
methods: {
expand: function(e) {
let h3Element = e.target.nextElementSibling;
h3Element.style.display = (h3Element.style.display === 'block')? 'none':'block';
}
}
});
* {
margin: 0px;
padding: 0px;
font-family: sans-serif;
list-style-type: none;
}
body {
background: #003366;
}
#container {
width: 1000px;
margin: 100px auto;
}
#elements {
width: 100%;
}
#elements li {
display: inline-block;
width: 40%;
margin: 40px 5%;
background: #FFF;
color: #003366;
box-shadow: 10px 10px 0px #222;
user-select: none;
}
#elements li h1,
h3 {
padding: 10px 20px;
}
#elements li h3 {}
#elements li h1 {
cursor: pointer;
}
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<body>
<div id="container">
<ul id='elements'>
<li v-for="(eleObject,i) in eleObjects">
<h1 v-on:click="expand($event)" v-text="eleObject.name"></h1>
<h3 v-text="eleObject.description" v-show="eleObject.show"></h3>
</li>
</ul>
</div>
</body>