触发Vue函数以更改某些组件字段时出现的问题

问题描述 投票:0回答:1

好吧,请注意,这是一个非常新手的问题,因为我只是开始使用Vue.js。

所以,我有一个标签和一个按钮。如果标签不可见,则按钮应显示“显示标签”,然后单击...显示标签。当标签可见时,按钮应显示“隐藏标签”,并在单击时将其隐藏。

此(具有计算的属性)显示/隐藏标签,但不更改按钮标题:

<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
    </head>
    <body>

        <div id="app">
            {{ message }}
            This is another thing: <b>{{thing}}</b><br>
            <span :title="title" @click="doSomething">NO TITLE</span>
            <ul v-for="item in items">
                <li>{{item}}</li>
            </ul>
            <button @click="labelVisible=!labelVisible">{{toggleMessage}}</button>
            <label v-if="labelVisible">This is my label</label>
        </div>
    </body>
    <script>
        var app = new Vue({ 
            el: '#app',
            data: {
                message: 'Hello Vue!',
                thing: 'thing',
                title: "This is the title",
                doSomething: ()=>{
                    alert("did something")
                },
                items: ["one", "two", "three"],
                labelVisible: true
            },
            computed: {
                toggleMessage: ()=>{
                    if (this.labelVisible) {
                        return "Hide Label";
                    }
                    else {
                        return "Show Label";
                    }
                }
            }
        });
    </script>
</html>

[这个(仅带有on:click绑定)不执行任何操作:

<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
    </head>
    <body>

        <div id="app">
            {{ message }}
            This is another thing: <b>{{thing}}</b><br>
            <span :title="title" @click="doSomething">NO TITLE</span>
            <ul v-for="item in items">
                <li>{{item}}</li>
            </ul>
            <button @click="buttonClicked">{{toggleMessage}}</button>
            <label v-if="labelVisible">This is my label</label>
        </div>
    </body>
    <script>
        var app = new Vue({ 
            el: '#app',
            data: {
                message: 'Hello Vue!',
                thing: 'thing',
                title: "This is the title",
                doSomething: ()=>{
                    alert("did something")
                },
                items: ["one", "two", "three"],
                labelVisible: true,
                toggleMessage: "Hide Label",
                buttonClicked: ()=> {
                    this.labelVisible = !this.labelVisible;
                    if (this.labelVisible) {
                        this.toggleMessage = "Hide Label";
                    }
                    else {
                        this.toggleMessage = "Show Label";
                    }
                }
            }
        });
    </script>
</html>

最好,我想让他们两个都工作。但是我仍然看不到我在做什么错。 Vue DevTools报告没有任何问题...


UPDATE:

[在第二种情况下,当打印出labelVisibletoggleMessage的值时,它们的变化确实很好。只是更改未反映在组件中。

javascript html vue.js
1个回答
0
投票

好,所以,我要给自己发布答案。

@ AlexBrohshtut发现的是正确的。胖箭头功能是个问题。

但是,最重要的部分是我没有将函数放在methods中(我也将它们放在data部分中)。 Pff ...

所以,this起作用:

<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
    </head>
    <body>

        <div id="app">
            {{ message }}
            This is another thing: <b>{{thing}}</b><br>
            <span :title="title" @click="doSomething">NO TITLE</span>
            <ul v-for="item in items">
                <li>{{item}}</li>
            </ul>
            <button @click="buttonClicked">{{toggleMessage}}</button>
            <label v-if="labelVisible">This is my label</label>
        </div>
    </body>
    <script>
        var app = new Vue({ 
            el: '#app',
            data: {
                message: 'Hello Vue!',
                thing: 'thing',
                title: "This is the title",
                doSomething: ()=>{
                    alert("did something")
                },
                items: ["one", "two", "three"],
                labelVisible: true,
                toggleMessage: "Hide Label",

            },
            methods: {
                buttonClicked: function() {
                    console.log("button");
                    this.labelVisible = !this.labelVisible;
                    console.log(this.labelVisible);
                    if (this.labelVisible) {
                        this.toggleMessage = "Hide Label";
                    }
                    else {
                        this.toggleMessage = "Show Label";
                    }
                    console.log(this.toggleMessage);
                }
            }
        });
    </script>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.