vue如何使用TypeScript语法
<h2>前言</h2><p>已经用TS写了半年了多了,然后总结下如何如何在vue项目中使用ts吧,好复习</p>
<p>主要内容包含:组件,axios请求,vuex,父子组件传值,Mixins等。</p>
<p>vue中常用功能点代码用js/ts写法分开书写,这样会好区别和理解</p>
<p> </p>
<h2 data-id="heading-6">一、新建项目</h2>
<div>
<div class="cnblogs_code">
<pre>vue create vue-ts-admin</pre>
</div>
<p>按步骤开始安装,安装过程中选择TypeScript,vuex,路由router; 使用<code>npm run serve</code>启动项目</p>
<h3 data-id="heading-5">1. 在vue中书写ts的必备插件!</h3>
<p>vue-class-component 强化 Vue 组件,使用装饰器语法使 Vue 组件更好的跟TS结合使用。 vue-property-decorator在 vue-class-component 的基础上增加了更多与 Vue 相关的装饰器,使Vue组件更好的跟TS结合使用。</p>
<div class="cnblogs_code">
<pre>npm i vue-class-component -s-<span style="color: rgba(0, 0, 0, 1)">d
npm ivue</span>-property-decorator -s-d</pre>
</div>
<h2 data-id="heading-6">二、ts写vue单文件写法</h2>
<h3 data-id="heading-7">2.1单页面格式怎么写</h3>
<p>vue单页面的格式的写法不变,同样由template、script、style组成; 唯一区别:<code><script src="ts"></code></p>
<div class="cnblogs_code">
<pre><template>
<div class="hello"></div>
</template>
<script src="ts"></script>
<style scoped></style></pre>
</div>
<h4 data-id="heading-8">2.1.1 vue项目中的mian.ts及app.vue</h4>
<p><strong>main.ts写法</strong></p>
<div class="cnblogs_code">
<pre>import Vue from 'vue'<span style="color: rgba(0, 0, 0, 1)">
import App from </span>'./App.vue'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">vuex</span>
import store from './store'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 路由</span>
import router from './router'<span style="color: rgba(0, 0, 0, 1)">
Vue.config.productionTip </span>= <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vue({
store,
router,
render: h </span>=><span style="color: rgba(0, 0, 0, 1)"> h(App)
}).$mount(</span>'#app')</pre>
</div>
<p><strong>app.vue写法</strong></p>
<div class="cnblogs_code">
<pre><template>
<div id="app">
<!-- 使用路由的方法,也可以不用路由,直接引子组件 -->
<router-view></router-view>
</div>
</template>
<script lang="ts">
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意点:1.下面的代码必须在每个页面都中引入</span>
import { Component, Vue } from 'vue-property-decorator'<span style="color: rgba(0, 0, 0, 1)">;
@Component
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意点:2.每个页面都有组件名称:App/自定义</span>
export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends Vue {
}
</span></script></pre>
</div>
<h3 data-id="heading-9"> </h3>
<div>
<div>
<h3 data-id="heading-9">2.2 如何在Data双向绑定值</h3>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{msg}}</h1>
</div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
};
},
}
</span></script></pre>
</div>
<pre><code class="hljs language-html copyable" lang="html"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="javascript"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{msg}}</h1>
</div>
</template>
<script src="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue, } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意点:3.public是公用的意思,可省略;没有data,return,直接放要绑定的值</span>
public msg!: number |<span style="color: rgba(0, 0, 0, 1)"> string;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> msg!: number | string;</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span></script></pre>
</div>
<h3 data-id="heading-10">2.3 如何引入子组件及组件传值</h3>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<MenuBar :setMsg="msg"/>
</div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import MenuBar from </span>"../components/MenuBar.vue"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
props: {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 父组件的值</span>
<span style="color: rgba(0, 0, 0, 1)"> fatherMsg: {
type: String
}
},
components: {
MenuBar
},
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
};
},
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<MenuBar :setMsg="msg" />
</div>
</template>
<script src="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue, } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
import MenuBar from </span>"../components/MenuBar.vue"<span style="color: rgba(0, 0, 0, 1)">;
@Component({
components: {
MenuBar
},
})
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 父组件的传递过来的值</span>
@Prop() private fatherMsg!<span style="color: rgba(0, 0, 0, 1)">: string;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传递给子组件的值</span>
public msg!: number |<span style="color: rgba(0, 0, 0, 1)"> string;
}
</span></script></pre>
</div>
<h3 data-id="heading-11">2.4 生命周期的用法</h3>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{msg}}</h1>
</div>
</template>
<script>
<span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
};
},
created() {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.msg = data.name + data.age + "岁"<span style="color: rgba(0, 0, 0, 1)">;
},
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{msg}}</h1>
</div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue, } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
public msg</span>!: number |<span style="color: rgba(0, 0, 0, 1)"> string;
created(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"created"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.msg = data.name + data.age + "岁"<span style="color: rgba(0, 0, 0, 1)">;
}
beforeCreate(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforecreate"<span style="color: rgba(0, 0, 0, 1)">);
}
beforeMount(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforemounted"<span style="color: rgba(0, 0, 0, 1)">);
}
mounted(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"mounted"<span style="color: rgba(0, 0, 0, 1)">);
}
}
</span></script></pre>
</div>
<h3 data-id="heading-12">2.5 methods方法</h3>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{count}}</h1>
<button class="btn" @click="addCount">add</button>
</div>
</template>
<script>
<span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
};
},
methods: {
addCount() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
}
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{count}}</h1>
<button class="btn" @click="addCount">add</button>
</div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue, } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
public count: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法也是直接写到外层</span>
<span style="color: rgba(0, 0, 0, 1)">addCount(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
}
</span></script></pre>
</div>
<pre><code class="hljs language-html copyable" lang="html"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="javascript"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-attr"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-number"><span class="hljs-comment"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-tag"><span class="hljs-name"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 data-id="heading-13">2.6 计算属性(computed)和监听属性(watch)</h3>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>计算属性:{{countChange}},结果+2:{{watchMsg}}</h1>
<button class="btn" @click="addCcountChange">计算属性:add</button>
<h1>监听:{{count}},结果+1:{{watchMsg}}</h1>
<button class="btn" @click="addCount">监听add</button>
</div>
</template>
<script>
<span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
watchMsg: </span>""<span style="color: rgba(0, 0, 0, 1)">
};
},
watch: {
count: {
handler(newVal, oldVal) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (newVal < 10<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我是数字" +<span style="color: rgba(0, 0, 0, 1)"> newVal;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我会继续增长"<span style="color: rgba(0, 0, 0, 1)">;
}
},
immediate: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
},
watchMsg: {
handler(newVal, oldVal) {
console.log(newVal);
},
immediate: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}
},
computed: {
countChange: {
get() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.count;
},
set(val) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count = val + 1<span style="color: rgba(0, 0, 0, 1)">;
}
}
},
methods: {
addCcountChange() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.countChange;
},
addCount() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
}
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>计算属性:{{countChange}},结果+2:{{watchMsg}}</h1>
<button class="btn" @click="addCcountChange">计算属性:add</button>
<h1>监听:{{count}},结果+1:{{watchMsg}}</h1>
<button class="btn" @click="addCount">监听add</button>
</div>
</template>
<scriptsrc="ts">
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 注意1.导入Watch</span>
import { Component, Vue,Watch } from "vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
public count: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
public watchMsg: string </span>= "开始"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 计算属性</span>
<span style="color: rgba(0, 0, 0, 1)">get countChange(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.count;
}
set countChange(val) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count = val + 1<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 注意2. 监听多个就导入多个Watch,命名自定义 clgMsg(newVal: string)</span>
@Watch("count"<span style="color: rgba(0, 0, 0, 1)">)
Count(newVal: number) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (newVal < 10<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我是数字" +<span style="color: rgba(0, 0, 0, 1)"> newVal;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我会继续增长"<span style="color: rgba(0, 0, 0, 1)">;
}
}
@Watch(</span>"watchMsg"<span style="color: rgba(0, 0, 0, 1)">)
clgMsg(newVal: string) {
console.log(newVal);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法</span>
<span style="color: rgba(0, 0, 0, 1)">addCcountChange(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.countChange++<span style="color: rgba(0, 0, 0, 1)">;
}
addCount(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
}
</span></script></pre>
</div>
<pre><code class="hljs language-html copyable" lang="html"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="actionscript"><span class="hljs-comment"><span class="hljs-meta"><span class="hljs-meta-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-number"><span class="hljs-comment"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-tag"><span class="hljs-name"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 data-id="heading-14">2.7 Mixins混入如何使用</h3>
<p>Mixins混入是公共方法同一调用;</p>
<h4 data-id="heading-15">2.7.1 Mixins文件的写法</h4>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre>export const TestMixins =<span style="color: rgba(0, 0, 0, 1)"> {
data(){
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">{
form:{}
}
},
methods:{
handleSubmit(name): {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve) =><span style="color: rgba(0, 0, 0, 1)"> {
resolve()
})
}
handleReset(name){
console.log(name)
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name
}
}
}</span></pre>
</div>
<ul>
<li>TS写法</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">必须引入</span>
import { Component, Vue, } from "vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导出模块</span>
declare module 'vue/types/vue'<span style="color: rgba(0, 0, 0, 1)"> {
interface Vue {
form: Object
handleSubmit(name: any): Promise</span><any><span style="color: rgba(0, 0, 0, 1)">
handleReset(name: any): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)">
}
}
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class TestMixins extends Vue {
form: Object </span>=<span style="color: rgba(0, 0, 0, 1)"> {}
handleSubmit(name: any): Promise</span><any><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve) =><span style="color: rgba(0, 0, 0, 1)"> {
resolve()
})
}
handleReset(name: any): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(name)
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> name
}
}</span></pre>
</div>
</div>
<div>
<pre><code class="hljs language-js copyable" lang="js"><span class="hljs-comment"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-built_in"><span class="hljs-string"><span class="hljs-attr"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-built_in"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword"><span class="hljs-built_in"><span class="hljs-keyword"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 data-id="heading-16">2.7.2 调用Mixins的vue文件写法</h4>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{handleReset("测试js-mixins")}}</h1>
</div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import TestMixins from </span>"../assets/mixin"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
mixins: ,
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
};
},
}
</span></script></pre>
</div>
<pre><code class="hljs language-html copyable" lang="html"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="javascript"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-number"><span class="hljs-tag"><span class="hljs-name"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{handleReset("测试TS-mixins222")}}</h1>
</div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import TestMixins from </span>"../assets/mixin"<span style="color: rgba(0, 0, 0, 1)">;
import { Component, Vue, Mixins} from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 写在@Component内</span>
<span style="color: rgba(0, 0, 0, 1)">@Component({
mixins:
})
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
public count: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
}
</span></script></pre>
</div>
<pre><code class="hljs language-html copyable" lang="html"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-tag"><span class="hljs-name"><span class="hljs-attr"><span class="hljs-string"><span class="javascript"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-attr"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-number"><span class="hljs-tag"><span class="hljs-name"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 data-id="heading-17">2.8 路由vue-Router及路由守卫</h3>
<h4 data-id="heading-18">2.8.1 安装导入路由—— mian.ts</h4>
<div class="cnblogs_code">
<pre>import Vue from 'vue'<span style="color: rgba(0, 0, 0, 1)">
import App from </span>'./App.vue'<span style="color: rgba(0, 0, 0, 1)">
import store from </span>'./store'<span style="color: rgba(0, 0, 0, 1)">
import router from </span>'./router'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1.导入组件</span>
import Component from 'vue-class-component'<span style="color: rgba(0, 0, 0, 1)">
Vue.config.productionTip </span>= <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.全局的路由守卫,js和ts的写法一致;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 2.组件内路由守卫,如果要在组件内部使用路由监听,路由钩子beforeRouteEnter,beforeRouteLeave,beforeRouteUpdate不生效。所以在此注册;</span>
<span style="color: rgba(0, 0, 0, 1)">Component.registerHooks([
</span>'beforeRouteEnter',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进入路由之前</span>
'beforeRouteLeave',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">离开路由之前</span>
'beforeRouteUpdate'<span style="color: rgba(0, 0, 0, 1)">
])
</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vue({
store,
router,
render: h </span>=><span style="color: rgba(0, 0, 0, 1)"> h(App)
}).$mount(</span>'#app')</pre>
</div>
<pre><code class="hljs language-js copyable" lang="js"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-literal"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-string"><span class="hljs-comment"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-function"><span class="hljs-params"><span class="hljs-string"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 data-id="heading-19">2.8.2 路由index文件写法—— router/index.ts</h4>
<div class="cnblogs_code">
<pre>import Vue from 'vue'<span style="color: rgba(0, 0, 0, 1)">;
import Router from </span>'vue-router'<span style="color: rgba(0, 0, 0, 1)">;
import stickyNotePage from </span>'../page/stickyNotePage.vue'<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Router({
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> history模式</span>
mode: 'history'<span style="color: rgba(0, 0, 0, 1)">,
base: process.env.BASE_URL,
routes: [
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 常规模块加载</span>
<span style="color: rgba(0, 0, 0, 1)"> {
path: </span>'/'<span style="color: rgba(0, 0, 0, 1)">,
name: </span>'stickyNotePage'<span style="color: rgba(0, 0, 0, 1)">,
component: stickyNotePage,
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 路由懒加载写法</span>
<span style="color: rgba(0, 0, 0, 1)"> {
path: </span>'/hello'<span style="color: rgba(0, 0, 0, 1)">,
name: </span>'hello'<span style="color: rgba(0, 0, 0, 1)">,
component: () </span>=> import(<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> webpackChunkName: "hello" </span><span style="color: rgba(0, 128, 0, 1)">*/</span>'../page/HelloWorld.vue'<span style="color: rgba(0, 0, 0, 1)">),
},
{
path: </span>'/learn'<span style="color: rgba(0, 0, 0, 1)">,
name: </span>'learn'<span style="color: rgba(0, 0, 0, 1)">,
component: () </span>=> import(<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> webpackChunkName: "learn" </span><span style="color: rgba(0, 128, 0, 1)">*/</span>'../page/learn.vue'<span style="color: rgba(0, 0, 0, 1)">),
},
],
})
Vue.use(Router);</span></pre>
</div>
<h4 data-id="heading-20">2.8.3 在页面中如何使用路由守卫</h4>
<h5 data-id="heading-21">全局的路由守卫,js和ts的写法一致;</h5>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 全局守卫</span>
import router from './router'<span style="color: rgba(0, 0, 0, 1)">
router.beforeEach((to, from, next) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(to.path);
next()
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 全局后置钩子</span>
router.afterEach((to,from)=><span style="color: rgba(0, 0, 0, 1)">{
alert(</span>"after each"<span style="color: rgba(0, 0, 0, 1)">);
})</span></pre>
</div>
<h5 data-id="heading-22">组件内路由守卫</h5>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{count}}</h1>
<button class="btn" @click="addCount">add</button>
</div>
</template>
<script>
<span style="color: rgba(0, 0, 255, 1)">var</span> data = {name: "小明",age: 18<span style="color: rgba(0, 0, 0, 1)">};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
};
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 进入路由触发</span>
beforeRouteEnter(to,from,next)=><span style="color: rgba(0, 0, 0, 1)">{
console.log(</span>"beforeRouteEnter111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
beforeRouteUpdate(to,from,next)</span>=><span style="color: rgba(0, 0, 0, 1)">{
console.log(</span>"beforeRouteUpdate111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 离开路由触发</span>
beforeRouteLeave(to,from,next)=><span style="color: rgba(0, 0, 0, 1)">{
console.log(</span>"beforeRouteLeave111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<h1>{{count}}</h1>
</div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue, } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
public count: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 进入路由触发</span>
beforeRouteEnter(to: any, from: any, next: () => <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteEnter111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
beforeRouteUpdate(to: any, from: any, next: () </span>=> <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteUpdate111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 离开路由触发</span>
beforeRouteLeave(to: any, from: any, next: () => <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteLeave111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
}
</span></script></pre>
</div>
<p> </p>
<h3 data-id="heading-23">2.9 vuex</h3>
<h4 data-id="heading-24">2.9.1 vuex/scr/store/index.ts写法</h4>
<p>js、ts写法除了类型判断其他区别不大;</p>
<div class="cnblogs_code">
<pre>import Vue from 'vue'<span style="color: rgba(0, 0, 0, 1)">
import Vuex from </span>'vuex'<span style="color: rgba(0, 0, 0, 1)">
Vue.use(Vuex)
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vuex.Store({
state: {
isShowEdit: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
onlySticky: </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
},
mutations: {
SHOW_EDIT(state: any, editMemo: any) {
console.log(editMemo)
state.onlySticky </span>=<span style="color: rgba(0, 0, 0, 1)"> editMemo;
state.isShowEdit </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
},
actions: {
},
modules: {
}
})</span></pre>
</div>
<pre><code class="hljs language-js copyable" lang="js"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-string"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-attr"><span class="hljs-attr"><span class="hljs-literal"><span class="hljs-attr"><span class="hljs-literal"><span class="hljs-attr"><span class="hljs-attr"><span class="hljs-built_in"><span class="hljs-literal"><span class="hljs-attr"><span class="hljs-attr"><span class="copy-code-btn"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 data-id="heading-25">2.9.2 vuex调用单页面的写法</h4>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<button @click="showEdit('vuex')">测试vuex</button>
</div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import { mapActions, mapState, mapGetters, mapMutations } from </span>"vuex"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
stickyList:[],
};
},
created() {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.stickyList = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$store.state.onlySticky;
},
methods: {
...mapMutations([</span>"SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">]),
showEdit(item) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">, item);
},
}
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello">
<button @click="showEdit('vuex')">测试vuex</button>
</div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue,} from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
import ItemData from </span>"../model/ItemData"; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入类</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 写在@Component内</span>
<span style="color: rgba(0, 0, 0, 1)">@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
stickyList: </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$store.state.onlySticky;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> vuex,如果this.$store一直报错,则在单页面引入 import Vuex from 'vuex'</span>
<span style="color: rgba(0, 0, 0, 1)">showEdit(item) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">, item);
}
}
</span></script></pre>
</div>
<h3 data-id="heading-26">2.10 axios请求数据</h3>
<h4 data-id="heading-27">2.10.1 main.ts</h4>
<div class="cnblogs_code">
<pre>import axios from 'axios'<span style="color: rgba(0, 0, 0, 1)">
Vue.prototype.$axios </span>= axios;</pre>
</div>
<pre><code class="copyable"><span class="copy-code-btn"> </span></code></pre>
<p>关于axios的封装,在之前的博客中已经讲述过了,就不在封装,ts语法除了类型其他区别不大,这里直接使用的是挂载axios和引入axios的方式,</p>
<h4 data-id="heading-28">2.10.2 单页使用</h4>
<ul>
<li>js写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello"><span style="color: rgba(0, 0, 0, 1)">
axios请求
</span></div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
};
},
created() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求地址https://www.foobar.com/my-app/user/add</span>
const url1 = "https://www.foobar.com/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$axios.get(url1, { params: { type: "js" } }).then(res =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用vue代理</span>
const url2 = "/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$axios.get(url2, { params: { type: "Ts" } }).then(res =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
},
}
</span></script></pre>
</div>
<ul>
<li>ts写法</li>
</ul>
<div class="cnblogs_code">
<pre><template>
<div class="hello"><span style="color: rgba(0, 0, 0, 1)">
axios请求
</span></div>
</template>
<scriptsrc="ts"><span style="color: rgba(0, 0, 0, 1)">
import { Component, Vue,} from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
import axios from </span>"axios"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 写在@Component内</span>
<span style="color: rgba(0, 0, 0, 1)">@Component
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
created(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
const url1 </span>= "https://www.foobar.com/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
axios.get(url1, { params: { type: </span>"js" } }).then((res: any) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用vue代理</span>
const url2 = "/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
axios.get(url2, { params: { type: </span>"Ts" } }).then((res: any) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
}
}
</span></script></pre>
</div>
<div>
<div>
<h2 data-id="heading-30">附:js常规书写vue--demo源码</h2>
<div class="cnblogs_code"><img id="code_img_closed_8dc1c1f6-dbbd-4f81-8eb3-686ad858cc8e" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_8dc1c1f6-dbbd-4f81-8eb3-686ad858cc8e" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_8dc1c1f6-dbbd-4f81-8eb3-686ad858cc8e" class="cnblogs_code_hide">
<pre><template>
<div class="hello">
<MenuBar />
<router-link :to="{path:'hello'}">测试路由守卫-->去helloword</router-link>
<h1>{{handleReset("测试mixins222")}}</h1>
<h1>{{msg}}</h1>
<h1>{{fatherMsg}}</h1>
<h1>计算属性:{{countChange}},结果:{{watchMsg}}</h1>
<button class="btn" @click="addCcountChange">计算属性:add</button>
<h1>监听:{{count}},结果:{{watchMsg}}</h1>
<button class="btn" @click="addCount">监听add</button>
<button @click="showEdit('vuex')">测试vuex</button>
</div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import MenuBar from </span>"../components/MenuBar.vue"<span style="color: rgba(0, 0, 0, 1)">;
import TestMixins from </span>"../assets/mixin"<span style="color: rgba(0, 0, 0, 1)">;
import { mapActions, mapState, mapGetters, mapMutations } from </span>"vuex"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data =<span style="color: rgba(0, 0, 0, 1)"> {
name: </span>"小明"<span style="color: rgba(0, 0, 0, 1)">,
age: </span>18<span style="color: rgba(0, 0, 0, 1)">
};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
props: {
fatherMsg: {
type: String
}
},
mixins: ,
components: {
MenuBar
},
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
count: </span>0<span style="color: rgba(0, 0, 0, 1)">,
watchMsg: </span>""<span style="color: rgba(0, 0, 0, 1)">,
stickyList: []
};
},
created() {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.msg = data.name + data.age + "岁"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.stickyList = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$store.state.onlySticky;
},
mounted() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 页面内部使用路由守卫</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.$router.beforeEach((to, from, next) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"我要去" +<span style="color: rgba(0, 0, 0, 1)"> from.name);
next();
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> axios请求</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求地址https://www.foobar.com/my-app/user/add</span>
const url1 = "https://www.foobar.com/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$axios.get(url1, { params: { type: "js" } }).then(res =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用代理</span>
const url2 = "/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$axios.get(url2, { params: { type: "Ts" } }).then(res =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
},
watch: {
countChange: {
handler(newVal, oldVal) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (newVal < 5<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我是数字" +<span style="color: rgba(0, 0, 0, 1)"> newVal;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我会继续增长"<span style="color: rgba(0, 0, 0, 1)">;
}
},
immediate: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
},
watchMsg: {
handler(newVal, oldVal) {
console.log(newVal);
},
immediate: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}
},
computed: {
countChange: {
get() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.count;
},
set(val) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count = val + 2<span style="color: rgba(0, 0, 0, 1)">;
}
}
},
methods: {
...mapMutations([</span>"SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">]),
showEdit(item) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">, item);
},
addCcountChange() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.countChange++<span style="color: rgba(0, 0, 0, 1)">;
},
addCount() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
}
};
</span></script></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2 data-id="heading-31">demo-上述代码用Ts书写vue</h2>
<div class="cnblogs_code"><img id="code_img_closed_b63a758c-4202-4cd2-8123-58437b91392b" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_b63a758c-4202-4cd2-8123-58437b91392b" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_b63a758c-4202-4cd2-8123-58437b91392b" class="cnblogs_code_hide">
<pre><template>
<div class="hello">
<MenuBar />
<router-link :to="{path:'learn'}">测试路由守卫-->去learn</router-link>
<h1>{{handleReset("测试mixins111")}}</h1>
<h1>{{msg}}</h1>
<h1>{{fatherMsg}}</h1>
<h1>计算属性:{{countChange}},结果+2:{{watchMsg}}</h1>
<button class="btn" @click="addCcountChange">计算属性:add</button>
<h1>监听:{{count}},结果+1:{{watchMsg}}</h1>
<button class="btn" @click="addCount">监听add</button>
<button @click="showEdit('vuex')">测试vuex</button>
</div>
</template>
<!-- 使用ts书写js -->
<script lang="ts"><span style="color: rgba(0, 0, 0, 1)">
import router from </span>"../router"<span style="color: rgba(0, 0, 0, 1)">;
import { Component, Prop, Vue, Watch, Mixins } from </span>"vue-property-decorator"<span style="color: rgba(0, 0, 0, 1)">;
import MenuBar from </span>"../components/MenuBar.vue"<span style="color: rgba(0, 0, 0, 1)">;
import TestMixins from </span>"../assets/mixin"<span style="color: rgba(0, 0, 0, 1)">;
import ItemData from </span>"../model/ItemData"; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入类</span>
import axios from "axios"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> data =<span style="color: rgba(0, 0, 0, 1)"> {
name: </span>"小明"<span style="color: rgba(0, 0, 0, 1)">,
age: </span>18<span style="color: rgba(0, 0, 0, 1)">
};
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件</span>
<span style="color: rgba(0, 0, 0, 1)">@Component({
components: {
MenuBar
},
mixins:
})
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Home extends Vue {
@Prop() private fatherMsg</span>!<span style="color: rgba(0, 0, 0, 1)">: string;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 挂载值</span>
public msg!: number |<span style="color: rgba(0, 0, 0, 1)"> string;
public count: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
public watchMsg: string </span>= "开始"<span style="color: rgba(0, 0, 0, 1)">;
stickyList: </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$store.state.onlySticky;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 声明周期</span>
created(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"created"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.msg = data.name + data.age + "岁"<span style="color: rgba(0, 0, 0, 1)">;
const url1 </span>= "https://www.foobar.com/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
axios.get(url1, { params: { type: </span>"js" } }).then((res: any) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用vue代理</span>
const url2 = "/my-app/user/add"<span style="color: rgba(0, 0, 0, 1)">;
axios.get(url2, { params: { type: </span>"Ts" } }).then((res: any) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
}
beforeCreate() {
console.log(</span>"beforecreate"<span style="color: rgba(0, 0, 0, 1)">);
}
beforeMount() {
console.log(</span>"beforemounted"<span style="color: rgba(0, 0, 0, 1)">);
}
mounted() {
console.log(</span>"mounted"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 页面内部使用路由守卫</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> router.beforeEach((to, from, next) => {</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log("我来自" + from.name);</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> next();</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> });</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 进入路由触发</span>
beforeRouteEnter(to: any, from: any, next: () => <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteEnter111"<span style="color: rgba(0, 0, 0, 1)">);
console.log(to.path);
next();
}
beforeRouteUpdate(to: any, from: any, next: () </span>=> <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteUpdate111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 离开路由触发</span>
beforeRouteLeave(to: any, from: any, next: () => <span style="color: rgba(0, 0, 255, 1)">void</span>): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>"beforeRouteLeave111"<span style="color: rgba(0, 0, 0, 1)">);
next();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 计算属性</span>
<span style="color: rgba(0, 0, 0, 1)">get countChange(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.count;
}
set countChange(val) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.count = val + 1<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 监听</span>
@Watch("count"<span style="color: rgba(0, 0, 0, 1)">)
Count(newVal: number) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (newVal < 10<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我是数字" +<span style="color: rgba(0, 0, 0, 1)"> newVal;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.watchMsg = "我会继续增长"<span style="color: rgba(0, 0, 0, 1)">;
}
}
@Watch(</span>"watchMsg"<span style="color: rgba(0, 0, 0, 1)">)
clgMsg(newVal: string) {
console.log(newVal);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 方法</span>
<span style="color: rgba(0, 0, 0, 1)">addCcountChange(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.countChange++<span style="color: rgba(0, 0, 0, 1)">;
}
addCount(): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.count++<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> vuex</span>
<span style="color: rgba(0, 0, 0, 1)">showEdit(item) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("SHOW_EDIT"<span style="color: rgba(0, 0, 0, 1)">, item);
}
}
</span></script>
<!-- Add "scoped" attribute to limit CSS to <span style="color: rgba(0, 0, 255, 1)">this</span> component only -->
<style scoped lang="less"><span style="color: rgba(0, 0, 0, 1)">
h3 {
margin: 40px </span>0 0<span style="color: rgba(0, 0, 0, 1)">;
}
ul {
list</span>-style-<span style="color: rgba(0, 0, 0, 1)">type: none;
padding: </span>0<span style="color: rgba(0, 0, 0, 1)">;
}
li {
display: inline</span>-<span style="color: rgba(0, 0, 0, 1)">block;
margin: </span>0<span style="color: rgba(0, 0, 0, 1)"> 10px;
}
a {
color: #42b983;
}
</span></style></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p> </p>
<h2>总结</h2>
<p>还是以vue2.0的版本为主的,后面在看看vue3 的写法 ,其实也差不多吧,用法 继续折腾吧 少年</p>
</div>
</div>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/yf-html/p/13723268.html
頁:
[1]