如何使用vue.js定位多个元素中的特定单击元素

时间:2018-12-09 17:00:01

标签: javascript html vue.js javascript-events event-handling

一般来说,我是前端的新手,尤其是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>

3 个答案:

答案 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;
}

这是最终的演示:https://jsbin.com/jiduzoduri/1/edit?html,js,output

答案 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并根据blocknone

进行更改

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>