Vue_基础功能循环、计算、绑定、事件处理、组件

  1 <!DOCTYPE html>
  2 <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6     <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  7 </head>
  8 <style>
  9     .class1{
 10         /*background-color: green;*/
 11         background: red;
 12         color: yellow;
 13     }
 14 </style>
 15 <body>
 16     <div id="app">
 17         <p>{{message}}</p>
 18         <p v-if="seen">现在你看到我了</p><!--v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素-->
 19         <p v-show="ok">Hello!</p><!--使用 v-show 指令来根据条件展示元素-->
 20         <a v-bind:href="url">百度一下</a><!-- 在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定-->
 21         <a :href="url">百度一下v-bind缩写</a><!-- v-bind 缩写 -->
 22         <br>
 23         <input v-model="message1"><!--v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值-->
 24         <br>
 25         <button v-on:click="reverseMessage">反转字符串</button><!--按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应-->
 26         <button @click="reverseMessage">反转字符串v-on缩写</button><!-- v-on 缩写 -->
 27         <br>{{message|capitalize}}<!-- 过滤器函数接受表达式的值作为第一个参数;对输入的字符串第一个字母转为大写-->
 28 
 29         <br><h1>v-if条件语句</h1>
 30         <div v-if="Math.random()>0.5"><!--随机生成一个数字,判断是否大于0.5,然后输出对应信息-->
 31             Sorry
 32         </div>
 33         <div v-else><!--用 v-else 指令给 v-if 添加一个 "else" 块-->
 34             Not Sorry
 35         </div>
 36         <!--判断 type 变量的值-->
 37         <div v-if="type == 'A'">A</div>
 38         <div v-else-if="type == 'B'">B</div>
 39         <div v-else-if="type == 'C'">C</div>
 40         <div v-else>Not A/B/C</div>
 41 
 42     </div>
 43 
 44     <hr>
 45     <div id="vue_det">
 46         <h1>site:{{site}}</h1><!-- {{ }} 用于输出对象属性和函数返回值-->
 47         <h1>url:{{url}}</h1>
 48         <h1>{{details()}}</h1>
 49     </div>
 50 
 51     <hr>
 52     <div id="app1">
 53         <div v-html="message"></div><!--使用 v-html 指令用于输出 html 代码-->
 54     </div>
 55 
 56     <hr>
 57     <div id="app2">
 58         <label for="r1">修改颜色</label>
 59         <input type="checkbox" v-model="use" id="r1"><br>
 60         <div v-bind:class="{'class1':use}"><!--HTML 属性中的值应使用 v-bind 指令-->
 61             v-bind:class改变颜色
 62         </div>
 63     </div>
 64 
 65     <hr>
 66     <div id="app3"><!--表达式-->
 67         {{5+5}}<br>
 68         {{ok? 'Yes' : 'No'}}<br><!--三元运算-->
 69         {{message.split('').reverse().join('')}}<!--分割、翻转、拼接-->
 70         <div v-bind:id="'list-'+id">百度一下</div>
 71     </div>
 72 
 73     <hr><h1>v-for循环语句</h1>
 74     <div id="app4">
 75         <ol>
 76             <li v-for="site in sites"><!--v-for 指令需要以 site in sites 形式的特殊语法-->
 77                 {{site.name}}
 78             </li>
 79         </ol>
 80         <ul>
 81             <template v-for="site in sites"><!--模板中使用 v-for-->
 82                 <li>{{site.name}}</li>
 83             </template>
 84         </ul>
 85         <ul>
 86             <li v-for="value,key,index in object"><!--<li v-for="(value, key, index) in object">-->
 87                 {{index}}:{{key}}---{{value}}
 88             </li>
 89             <li v-for="n in 10">{{n}}</li><!--循环整数-->
 90         </ul>
 91     </div>
 92 
 93     <hr><h1>computed计算属性</h1>
 94     <div id="app5">
 95         <p>原始字符串:{{message}}</p>
 96         <p>计算后的反转字符串:{{reversedMessage}}</p>
 97     </div>
 98 
 99     <hr><h1>监听属性</h1>
100         <div id="app6">
101             <p style="font-size: 25px;">计数器:{{counter}}</p>
102             <button @click="counter++" style="font-size: 25px;">点击计数</button><br>
103             千米:<input type="text" v-model="kilometers">
104             米:<input type="text" v-model="meters">
105             <p id="info"></p>
106         </div>
107 
108     <hr><h1>样式绑定</h1>
109         <div id="app7">
110             <div v-bind:style="styleObject">字体样式改变</div>
111             <div v-bind:style="[styleObject, backStyle]">字体多种样式改变</div>
112         </div>
113 
114     <hr><h1>事件处理器v-on</h1>
115         <div id="app8">
116             <button @click="counter+=1">增加1</button>
117             <p>这个按钮被点击了{{counter}}次</p>
118             <button @click="say('hi')">Say hi</button>
119             <button @click="say('what')">Say what</button>
120         </div>
121     <hr><h1>表单,用 v-model 指令在表单控件元素上创建双向数据绑定</h1>
122 <!--    如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入-->
123 <!--    <input v-model.trim="msg">-->
124         <div id="app9">
125             <input v-model="message" placeholder="编辑内容显示。。。">
126             <textarea v-model="message1" placeholder="多行文本输入"></textarea>
127 
128             <p>单个复选框:</p>
129             <input type="checkbox" id="checkbox" v-model="checked">
130             <label for="checkbox">{{checked}}</label>
131             <p>多个复选框:</p>
132             <input type="checkbox" id="taobao1" value="taobao" v-model="checkedNames">
133             <label for="taobao1">taobao</label>
134             <input type="checkbox" id="google1" value="google" v-model="checkedNames">
135             <label for="google1">google</label>
136             <input type="checkbox" id="facebook1" value="facebook" v-model="checkedNames">
137             <label for="facebook1">facebook</label>
138             <br>
139             <span>选择的值为:{{checkedNames}}</span>
140 
141             <p>单选框:</p>
142             <input type="radio" id="facebook2" value="facebook" v-model="picked">
143             <label for="facebook2">facebook</label>
144             <br>
145             <input type="radio" id="google2" value="google" v-model="picked">
146             <label for="google2">google</label>
147             <br>
148             <span>选择的值为:{{picked}}</span>
149 
150             <p>下拉列表--select 列表</p>
151             <select v-model="selected" name="好像没用上">
152                 <option value="">选择一个网站</option>
153                 <option value="www.baidu.com">百度</option>
154                 <option value="www.taobao.com">淘宝</option>
155             </select>
156             <div id="output">选择的网站是:{{selected}}</div>
157 
158         </div>
159 
160     <hr><h1>组件Component</h1>
161         <div id="app10">
162             <chunfang></chunfang>
163             <chunfang1></chunfang1>
164             <child message="Hello!"></child>
165         </div>
166         <div id="app11">
167             <input v-model="parentMsg"><br>
168             <child2 v-bind:message2="parentMsg"></child2><!--用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件-->
169         </div>
170     <hr><h1>组件Component--自定义事件</h1>
171         <div id="app12">
172             <div id="counter-event-example">
173                 <p>{{total}}</p>
174                 <button-counter v-on:increment="incrementTotal"></button-counter>
175                 <button-counter v-on:increment="incrementTotal"></button-counter>
176             </div>
177         </div>
178 
179     <hr><h1>自定义指令</h1>
180         <div id="app13">
181             <p>页面载入时,input元素自动获取焦点</p>
182             <input v-focus>
183         </div>
184 
185     <script>
186         new Vue({
187             el:'#app',
188             data:{
189                 message:'baidu!',
190                 message1:'百度一下,输入框填入的',
191                 seen:true,
192                 ok:true,
193                 url:'https://www.baidu.com',
194                 type:'C'
195             },
196             methods: {
197                 reverseMessage:function () {
198                     this.message1 = this.message1.split('').reverse().join('')
199                 }
200             },
201             filters:{
202                 capitalize:function (value) {
203                     if(!value) return '';
204                     value = value.toString();
205                     return value.charAt(0).toUpperCase()+value.slice(1)
206                 }
207             }
208         });
209 
210         var vm = new Vue({// Vue 构造器
211             el:'#vue_det',//el 参数,它是 DOM 元素中的 id
212             data:{//data 用于定义属性
213                 site:"第一个正式的测试VUE",
214                 url:"www.baidu.com",
215                 alexa:"10000"
216             },
217             methods:{//methods 用于定义的函数,可以通过 return 来返回函数值
218                 details:function () {
219                     return this.site + "-这是一个连接到百度的网址";
220                 }
221             }
222         });
223 
224         new Vue({
225             el:'#app1',
226             data:{
227                 message: '<h1>百度一下</h1>'
228             }
229         });
230 
231         new Vue({
232             el:'#app2',
233             data:{
234                 use:false//判断 use 的值,如果为 true 使用 class1 类的样式,否则不使用该类
235             }
236         });
237 
238         new Vue({
239             el:'#app3',
240             data:{
241                 ok:true,
242                 message:'baidu',
243                 id:1
244             }
245         });
246 
247         new Vue({
248             el:'#app4',
249             data:{
250                 sites:[
251                     {name:'baidu'},
252                     {name:'360'},
253                     {name:'雅虎'},
254                 ],
255                 object:{
256                     name:'百度一下',
257                     url: 'http://www.baidu.com',
258                     slogan:'世界因我而改变!',
259                 },
260             },
261         });
262 
263         var vm = new Vue({
264             el:'#app5',
265             data:{message:'反转字符串'},
266             computed:{
267                 reversedMessage:function () {//声明了一个计算属性 reversedMessage
268                     return this.message.split('').reverse().join('')//// `this` 指向 vm 实例
269                 }
270             },
271         });
272 
273         var vm = new Vue({//实例进行千米与米之间的换算
274             el:'#app6',
275             data:{
276                 counter:1,
277                 kilometers:0,
278                 meters:0,
279             },
280             methods:{},
281             watch:{
282                 kilometers: function (val) {
283                     this.kilometers = val;
284                     this.meters =this.kilometers *1000;
285                 },
286                 meters:function (val) {
287                     this.kilometers = val/1000;
288                     this.meters = val;
289                 },
290             },
291         });
292         vm.$watch('kilometers',function (newValue,oldValue) {//通过 watch 来响应数据的变化
293             document.getElementById("info").innerHTML ="修改前的值为:"+oldValue+",修改后的值为:"+newValue;
294         });
295 
296         new Vue({
297             el:'#app7',
298             data:{
299                 styleObject:{
300                     color:'green',
301                     fontSize:'30px',
302                     width:'500px',
303                 },
304                 backStyle:{
305                     background:'red',
306                     'font-weight':'bold',
307                 },
308 
309             },
310         });
311 
312         new Vue({
313             el:'#app8',
314             data:{counter: 0},
315             methods:{//直接绑定到一个方法
316                 say:function (message) {
317                     alert(message);
318                 }
319             },
320         });
321 
322         new Vue({
323             el:'#app9',
324             data:{
325                 message:'xian显示在框中',
326                 message1:'多行文本显示框中\r\n并换行',
327                 checked:false,
328                 checkedNames:[],
329                 picked:'facebook',
330                 selected:'',
331             },
332         });
333 
334         Vue.component('chunfang',{//// 注册
335             template:'<h1>自定义的全局组件</h1>'
336         });
337         new Vue({//// 创建根实例
338             el:'#app10',
339         });
340 
341         var Child={template: '<h2>这是自定义的局部组件</h2>'};
342         new Vue({//// 创建根实例
343             el:'#app10',
344             components:{//// <chunfang1> 将只在父模板可用
345                 'chunfang1':Child,
346             },
347         });
348 
349         Vue.component('child',{// 注册
350             props:['message'],// 声明 props
351             template:'<span>{{message}}</span>',// 同样也可以在 vm 实例中像 “this.message” 这样使用
352         });
353         new Vue({// 创建根实例
354             el:'#app10',
355         });
356 
357         Vue.component('child2',{// 注册
358             props:['message2'],// 声明 props、、动态 Prop
359             template:'<span>{{message2}}</span>',// 同样也可以在 vm 实例中像 “this.message” 这样使用
360         });
361         new Vue({// 创建根实例
362             el:'#app11',
363             data:{
364                 parentMsg:'父组件的内容'
365             },
366         });
367 
368         Vue.component('button-counter',{
369             template:'<button v-on:click="incrementHandler">{{counter}}</button>',
370             data:function () {//// data 选项是一个函数,组件不相互影响
371                 return {counter:0}
372             },
373             methods:{
374                 incrementHandler:function () {
375                     this.counter+=1;
376                     this.$emit('increment');//使用 $emit(eventName) 触发事件
377                 },
378             },
379         });
380         new Vue({
381             el:'#app12',
382             data:{total:0},
383             methods:{
384                 incrementTotal:function () {
385                     this.total +=1;
386                 },
387             },
388         });
389 
390         Vue.directive('focus',{// 注册一个全局自定义指令 v-focus
391             inserted:function (el) {// 当绑定元素插入到 DOM 中。
392                 el.focus();// 聚焦元素
393             },
394         });
395         new Vue({// 创建根实例
396             el:'#app13',
397         });
398 
399     </script>
400 
401 </body>
402 </html>

 

posted @ 2020-08-14 17:15  白月如初12138  阅读(234)  评论(0)    收藏  举报