首页 文章

如何使用vuejs从多个元素中定位特定的单击元素

提问于
浏览
0

我总体上对前端有点新,特别是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 回答

  • 1

    mounted 钩子中,您需要通过添加名为 show 的新字段来更改 eleObjects 数组项目,该字段最初为 false 并且您使用 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;
    }
    
    <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(eleObject,i)" v-text="eleObject.name"></h1>
            <h3 v-text="eleObject.description" v-show="eleObject.show"></h3>
          </li>
        </ul>
      </div>
    </body>
    
  • 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>
    
  • 0

    为了达到理想的行为,在对象上有一些属性可以很好地表明事物是否可见 .

    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

相关问题