⑴ VUE DOM加载后执行自定义事件的方法
最近想用vue做一个小东西,谁知道一开始就遇到了一个棘手的问题:
首先我想在页面加载前通过ajax请求页面展示所需要的信息,于是我在created钩子函数里面请求了我想要的数据
created:function(){
var
url="/indexitem";
var
_self=this;
$.get(url,function(data){
_self.items=data;
});
$.get('/banner',function(data){
_self.banners=data;
});
}
这一步很顺利,接下来就是要将数据绑定到对应的元素中,我在这里需要将请求得到的图片地址绑定到轮播图对应的元素中,
我这里采用的是mui框架中提供的图片轮播(移动端,支持手势滑动),问题恰恰就这里:
<div
id="slider"
class="mui-slider"
@click="greet()">
<div
class="mui-slider-group
mui-slider-loop">
<div
class="mui-slider-item
mui-slider-item-plicate"><a
href="#"
rel="external
nofollow"
rel="external
nofollow"
rel="external
nofollow"
:style="{backgroundImage:
'url('
+
banners[banners.length-1].src+
')',backgroundSize:'cover'}"></a></div>
<div
class="mui-slider-item"
v-for="cc
in
banners"><a
href="#"
rel="external
nofollow"
rel="external
nofollow"
rel="external
nofollow"
:style="{backgroundImage:
'url('
+
cc.src+
')',backgroundSize:'cover'}"></a></div>
<div
class="mui-slider-item
mui-slider-item-plicate"><a
href="#"
rel="external
nofollow"
rel="external
nofollow"
rel="external
nofollow"
:style="{backgroundImage:'url('+banners[0].src+')',backgroundSize:'cover'}"></a></div>
</div>
<div
class="mui-slider-indicator">
<div
class="mui-indicator
mui-active"></div>
<div
class="mui-indicator"></div>
<div
class="mui-indicator"></div>
<div
class="mui-indicator"></div>
</div>
</div>
我绑定完数据之后,发现轮播图失效了,因为我之前用原生js写的时候遇到过同样的问题,我当时的解决办法是等页面加载完成后重新进行滑动初始化,但是今天用vue我蒙了,试了很多生命周期函数也无法确保在页面加载完成后进行初始化。
vue.js更多的希望是通过数据绑定来代替直接通过dom操作,而vue并没有提供渲染完成的钩子。
所以我今天的解决办法是:setTimeout()
在实例化VUE对象后添加下面代码:
setTimeout(function(){
console.log($('#slider').length);
var
gallery
=
mui('.mui-slider');
gallery.slider({
interval:
3000//自动轮播周期,若为0则不自动播放,默认为0;
});
},1000);
以上这篇VUE
DOM加载后执行自定义事件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:Vue自定义事件(详解)浅谈Vue.js
组件中的v-on绑定自定义事件理解Vue.js自定义事件的表单输入组件方法
⑵ Vue组件中prop属性使用说明实例代码详解
Prop
的大小写
(camelCase
vs
kebab-case)
HTML
中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用
DOM
中的模板时,camelCase
(驼峰命名法)
的
prop
名需要使用其等价的
kebab-case
(短横线分隔命名)
命名:
Vue.component('blog-post',
{
//
在
JavaScript
中是
camelCase
的
props:
['postTitle'],
template:
'<h3>{{
postTitle
}}</h3>'
})
<!--
在
HTML
中是
kebab-case
的
-->
<blog-post
post-title="hello!"></blog-post>
重申一次,如果你使用字符串模板,那么这个限制就不存在了。
静态的和动态的
Prop
像这样,你已经知道了可以像这样给
prop
传入一个静态的值:
<blog-post
title="My
journey
with
Vue"></blog-post>
你也知道
prop
可以通过
v-bind
动态赋值,例如:
<blog-post
v-bind:title="post.title"></blog-post>
在上述两个示例中,我们传入的值都是字符串类型的,但实际上任何类型的值都可以传给一个
prop。
传入一个数字
<!--
即便
`42`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:likes="42"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:likes="post.likes"></blog-post>
传入一个布尔值
<!--
包含该
prop
没有值的情况在内,都意味着
`true`。-->
<blog-post
favorited></blog-post>
<!--
即便
`false`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<base-input
v-bind:favorited="false">
<!--
用一个变量进行动态赋值。-->
<base-input
v-bind:favorited="post.currentUserFavorited">
传入一个数组
<!--
即便数组是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comment-ids="[234,
266,
273]"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:comment-ids="post.commentIds"></blog-post>
传入一个对象
<!--
即便对象是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comments="{
id:
1,
title:
'My
Journey
with
Vue'
}"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:post="post"></blog-post>
传入一个对象的所有属性
如果你想要将一个对象的所有属性都作为
prop
传入,你可以使用不带参数的
v-bind
(取代
v-bind:prop-name)。例如,对于一个给定的对象
post:
post:
{
id:
1,
title:
'My
Journey
with
Vue'
}
下面的模板:
<blog-post
v-bind="post"></blog-post>
等价于:
<blog-post
v-bind:id="post.id"
v-bind:title="post.title"
></blog-post>
Vue的组件中的props属性单向数据流
所有的
prop都使得其父子prop之间形成了一个单向下行绑定:父级
prop
的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中所有的
prop
都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变
prop。如果你这样做了,Vue
会在浏览器的控制台中发出警告。
这里有两种常见的试图改变一个
prop
的情形:
这个
prop
用来传递一个初始值;这个子组件接下来希望将其作为一个本地的
prop
数据来使用。在这种情况下,最好定义一个本地的
data
属性并将这个
prop
用作其初始值:
props:
['initialCounter'],
data:
function
()
{
return
{
counter:
this.initialCounter
}
}
这个
prop
以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个
prop
的值来定义一个计算属性:
props:
['size'],
computed:
{
normalizedSize:
function
()
{
return
this.size.trim().toLowerCase()
}
}
注意在
JavaScript
中对象和数组是通过引用传入的,所以对于一个数组或对象类型的
prop
来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
Prop
验证
我们可以为组件的
prop
指定需求。如果有一个需求没有被满足,则
Vue
会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。
为了定制
prop
的验证方式,你可以为
props
中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
Vue.component('my-component',
{
props:
{
//
基础的类型检查
(`null`
匹配任何类型)
propA:
Number,
//
多个可能的类型
propB:
[String,
Number],
//
必填的字符串
propC:
{
type:
String,
required:
true
},
//
带有默认值的数字
propD:
{
type:
Number,
default:
100
},
//
带有默认值的对象
propE:
{
type:
Object,
//
对象或数组且一定会从一个工厂函数返回默认值
default:
function
()
{
return
{
message:
'hello'
}
}
},
//
自定义验证函数
propF:
{
validator:
function
(value)
{
//
这个值必须匹配下列字符串中的一个
return
['success',
'warning',
'danger'].indexOf(value)
!==
-1
}
}
}
})
当
prop
验证失败的时候,(开发环境构建版本的)
Vue
将会产生一个控制台的警告。
注意那些
prop
会在一个组件实例创建之前进行验证,所以实例的属性
(如
data、computed
等)
在
default
或
validator
函数中是不可用的。
类型检查
type
可以是下列原生构造函数中的一个:
String
Number
Boolean
Function
Object
Array
Symbol
额外的,type
还可以是一个自定义的构造函数,并且通过
instanceof
来进行检查确认。例如,给定下列现成的构造函数:
function
Person
(firstName,
lastName)
{
this.firstName
=
firstName
this.lastName
=
lastName
}
你可以使用:
Vue.component('blog-post',
{
props:
{
author:
Person
}
})
来验证
author
prop
的值是否是通过
new
Person
创建的。
非
Prop
的特性
一个非
prop
特性是指传向一个组件,但是该组件并没有相应
prop
定义的特性。
因为显式定义的
prop
适用于向一个子组件传入信息,然而组件库的作者并不总能预见组件会被用于怎样的场景。这也是为什么组件可以接受任意的特性,而这些特性会被添加到这个组件的根元素上。
例如,想象一下你通过一个
Bootstrap
插件使用了一个第三方的
组件,这个插件需要在其
上用到一个
data-date-picker
特性。我们可以将这个特性添加到你的组件实例上:
<bootstrap-date-input
data-date-picker="activated"></bootstrap-date-input>
然后这个
data-date-picker=”activated”
特性就会自动添加到<bootstrap-date-input>
的根元素上。
替换/合并已有的特性
想象一下
<bootstrap-date-input>
的模板是这样的:
<input
type="date"
class="form-control">
为了给我们的日期选择器插件定制一个主题,我们可能需要像这样添加一个特别的类名:
<bootstrap-date-input
data-date-picker="activated"
class="date-picker-theme-dark"
></bootstrap-date-input>
在这种情况下,我们定义了两个不同的
class
的值:
form-control,这是在组件的模板内设置好的
date-picker-theme-dark,这是从组件的父级传入的
对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入
type=”text”
就会替换掉
type=”date”
并把它破坏!庆幸的是,class
和
style
特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control
date-picker-theme-dark。
禁用特性继承
如果你不希望组件的根元素继承特性,你可以设置在组件的选项中设置
inheritAttrs:
false。例如:
Vue.component('my-component',
{
inheritAttrs:
false,
//
...
})
这尤其适合配合实例的
$attrs
属性使用,该属性包含了传递给一个组件的特性名和特性值,例如:
{
class:
'username-input',
placeholder:
'Enter
your
username'
}
有了
inheritAttrs:
false
和
$attrs,你就可以手动决定这些特性会被赋予哪个元素。在撰写基础组件的时候是常会用到的:
Vue.component('base-input',
{
inheritAttrs:
false,
props:
['label',
'value'],
template:
`
<label>
{{
label
}}
<input
v-bind="$attrs"
v-bind:value="value"
v-on:input="$emit('input',
$event.target.value)"
>
</label>
`
})
这个模式允许你在使用基础组件的时候更像是使用原始的
HTML
元素,而不会担心哪个元素是真正的根元素:
<base-input
v-model="username"
class="username-input"
placeholder="Enter
your
username"
></base-input>
总结
以上所述是小编给大家介绍的Vue组件中prop属性使用说明,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:VueJs组件prop验证简单介绍Vue组件选项props实例详解vue父组件通过props如何向子组件传递方法详解详解vue2父组件传递props异步数据到子组件的问题详解vue父子组件间传值(props)Vue2.0利用
v-model
实现组件props双向绑定的优美解决方案
⑶ vue 框架怎么才能先渲染页面 后加载脚本
我们在使用Vue.js的时候,最基本的一个使用,就是在HTML引入Vue.js的库文件,并写如下一段代码:
1.var app = new Vue({
2. el: '#app',
3. data: {
4. message: 'Hello Vue!'
5. }
6.})
new Vue,本质就是生成一个Vue的对象,我们来了解一下这个生成Vue对象的过程是怎样的:
首先,Vue的入口是/src/entries/web-runtime-with-compiler.js,这是由config.js配置文件决定的。
这个入口文件中import了很多文件,其中有一条主要的脉络:
/src/entries/web-runtime-with-compiler.js
引用了/src/entries/web-runtime.js
引用了/src/core/index.js
引用了/src/core/instance/index.js
⑷ 为什么我使用vue的时候用路由时 可以中使用sub
Vue.js很简单。正因为如此简单,人们常常认为其适合于小项目。虽然真正的Vue.js核心知识只是一个视图层库,实际上有一组工具,将使您能够使用Vue.js构建完整的大规模SPA(单页应用程序)。 SPA应用可以在不完全重新加载网页,产生一个更流畅的用户体验到的用户交互响应。还有好的副作用,SPA还鼓励后端专注于展示数据端点,这使得整体架构更加分离,并且对于其他类型的客户端可能是可重用的。 从开发人员的角度来看,SPA和传统的后端呈现应用程序之间的主要区别是,我们必须将客户端视为具有自己架构的应用程序。通常,我们需要处理路由,数据获取和持久性,查看渲染和必要的构建设置,以便于模块化代码库。 对于基于Vue.js的SPA,下面工具将帮助你: 1.视图层:Vue.js 2.路由:vue-router,Vue的官方路由器 3.状态管理:vuex,受Flux/Rex启发的状态管理解决方案 4.服务通讯:vue-resource这是和RESTful后端交互的接口 5.构建工具:Webpack和vue-loader进行模块 热刷新ES2015和预处理器等重要的组件 视图层 本系列假设您已经熟悉Vue.js的基础知识,将Vue.js用于大型SPA时的核心概念是:将应用程序分为许多嵌套的自定义组件。在数据流的组件熟悉props和通讯定义事件直接进行平衡设计,将复杂组件切分为小型解耦的单元,更易于维护。 路由器 官方VUE路由器库处理客户端的路由,同时支持哈希模式和HTML5的历史模式。它与独立路由库有点不同,它与Vue.js深度集成,并假设我们将嵌套路由映射到嵌套Vue组件。 当使用vue-router时,我们将组件作为“pages”实现,使用这些组件能够实现党路由变化时,钩子函数被调用。 状态管理 状态管理是只有当应用程序复杂性超过一定水平时才出现。当有多个组件需要共享可变的应用程序状态时,如果您的应用程序中没有专用于管理此类共享状态的层,则可能很难推理和维护。 服务器通信 在本案例中,我们会使用RESful后端,这是一个Go语言编写的 go-vue-event项目 构建工具 首先,整个编译工具链依靠的Node.js ,管理所有使用库包和工具依赖NPM 。 虽然NPM开始是Node.js后端模块的包管理器,但它现在也广泛用于前端包管理。 因为所有NPM包是使用CommonJS模块格式创建的,我们需要一个特殊的工具将这些模块“捆绑”到适合最终部署的文件中。 Webpack就是这样一个工具,你可能也听说过一个类似的工具Browserify。 我们将使用Webpack的系列,因为它提供了更多的高级功能开箱即用,如热重新加载,bundle-splitting和静态文件处理。 无论WebPACK中和Browserify它们暴露的API,使我们能够装载更多的CommonJS的模块:例如,我们可以直接require()的HTML文件通过将其转化成一个JavaScript字符串。 通过将你的前端的一切,包括HTML,CSS甚至图像文件看作为模块依赖,可以在捆绑过程中任意转换,Webpack实际上涵盖了构建SPA时遇到的大多数构建任务。 我们主要是要使用WebPACK和普通 NPM脚本 ,而不需要 任务运行器如Gulp或Grunt。 使用vue-loader 激活单页中Vue组件: //app.vue <template> <h1 class="red">{{msg}}</h1> </template> export default{ data(){ return{ msg:'Hello world!' } } } <style> .red{ color:#f00; } </style> WebPACK和vue-loader组合能带来: : 1.默认情况下ES2015。 这允许我们今天使用未来的JavaScript语法,产生更具表达性和简洁的代码。 2.预埋处理器 。 您可以在单文件Vue组件中使用预处理器,例如使用Jade作为模板,使用SASS作为样式。 3.Vue组件内部CSS输出将自动加前缀。 您也可以使用任何PostCSS插件,如果你喜欢。 4.作用域CSS。 通过增加一个scoped属性添加到<style> ,VUE-loader将通过重写模板和样式模拟输出,特定组件的范围内的CSS不会影响应用程序的其他部分。 5.热刷新 。在开发过程中编辑Vue组件时,组件将“热切换”到正在运行的应用程序中,在不重新加载页面的情况下维护应用程序状态。 这极大地提高了开发体验。 开始设置 现在有了所有这些花哨的功能,对于自己组装构建栈可能是一个非常艰巨的任务! 幸运的是,Vue公司提供vue-cli ,一个命令行界面,十分容易上手: npm install -g vue-cli vue init webpack my-project 回答提示,CLI具有开箱即用特点。 所有你需要做的下一步是: cd my-project npm install # install dependencies npm run dev # start dev server at localhost:8080 以上所述是小编给大家介绍的使用Vue.js创建一个时间跟踪的单页应用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
⑸ vue内容都会被自动转义,所以防止了脚本注入吗
其实就是XSS攻击
⑹ 在vue中script里的import是什么意思
一个不错的开头
1 . 首先全局装vue-cli,它是vue的一个脚手架。
cnpm i -g vue-cli1
2 . 然后进入workspace。执行了如下代码,生成vue项目的初始化工作。这里是基于webpack打包。
vue init webpack learnvue1
3 . 引导定制过程中,测试的选项我全部选了否,完了之后,根据提示,进入learnvue。执行 了
cnpm i1
4 . ok,一切顺利。然后,执行
cnpm run dev
12
5 . ok,打开浏览器跑起来了,正常。
然而
6 . 解决scanning files to index
打开常用的webstorm 10.打开这个learnvue。看到了 scanning files to index。意思是正在扫描文件索引。听起来是项目文件读取的问题。怎么可能要扫描这么长时间。没有大文件呀?于是我放弃这次vue init出来的文件。决定删除它。就在我删除文件的时候,window提示我文件目录结构太深,无法删除。这让我想到了什么,那就是scanning files to index也是这个原因。唯一的就是node_moles。解决 scanning files to index的办法就是在这个node_mole文件上右键。mark Directory As > Excluded。
重新打开项目。ok!
7 . webtorm的两个vue插件都装了。(vue-for-idea和vue.js)
8 . 解决es 6
当我想愉快地尝试vue的时候,发现script里的代码给我标红了,说我语法错误了。于是在language &&framework里 解决es 6的问题。并且在vue的script里用type=”text/babel”或者type=”text/ecmascipt-6”什么的,还是描红报错。
⑺ vue从后台获取的数据有html标签通过v-html渲染到页面,然后怎么给这里面的html添加样式
要输入代码。
html:
<templatev-for="(item,index)inquestionnaireList">
<divclass="questionnaire-section"@click="onSection(item.id)">
<divclass="title">{{item.title}}</div>
</div>
</template>
varapp=newVue({
el:'#app',
data:{
questionnaireList:[],//定义一个空数组
currentPage:1,//当前页
},
//加载完后自动执行
mounted:function(){
varthat=this;
that.questionnaireData();//调用方法
},
methods:{
questionnaireData:function(){
varthat=this;
$.ajax({
url:url+"questionnaire",
type:"GET",
data:{
currPage:that.currentPage
},
success:function(res){
res.data.questions.map(function(item,index){
that.questionnaireList.push(item);
(7)vue字符串脚本扩展阅读:
一、在编辑器中创建一个web项目,抄并在目录中创建一个新的静态页面buttonclick.html:
二、在title标签中介绍准备好的vue.js库文件。在这里,将JS文件放在JS目录中,然后在body标记中插入一个div和四个按钮,将click事件袭与Vue中的v-on标记绑定:
三、接下来,插入脚本标记,在标百记中写入事件函数,在事件中传递参数,然后打开浏览器查看结果:
四、打开浏览器并单击其中一度个按钮以打开窗口返回的元素对象。以上是如何使用Vue获取click事件元素。