先说问题,父组件利用props向子组件传值,浏览器
console
有这个值,但是获取不到内部的属性,困了我3个小时,真的
personal
console
以下为原代码
1、homevue(父组件)--personal是被传的参数
<!--子组件-->
<form-picker
class="form-picker"
:personal="personal"
>
</form-picker>
export
default
{
data(){
return{
personal:{
state:'',////判断是修改状态,还是新增状态
add/edit
data:[]
}
}
},
mounted(){
this$apipersonalsearchPersonalInfo(thisuserInfouserId)then((res)=>{
thispersonaldata
=
resdatadata
//这里给personal对象赋值接口传来的数据
})
},
}
2、formPicker
(子组件)
--接收personal
export
default
{
props:['active','personal'],
mounted(){
consolelog(149,thispersonal)
consolelog(150,thispersonalstate)
}
}
运行结果
明明149行有
state
值,150行输出却没有了,是不是超级奇怪
后面经过大佬的讲解,其实浏览器consolelog也是应该没有的
所以,其实我们子组件一开始根本就没有取到这个personal这个对象。
3、解决方法--使用watch
父组件
export
default
{
data(){
return{
personal:{
state:'',////判断是修改状态,还是新增状态
add/edit
data:[]
}
}
},
mounted(){
this$apipersonalsearchPersonalInfo(thisuserInfouserId)then((res)=>{
//thispersonaldata
=
resdatadata
//这里给personal对象赋值接口传来的数据
//使用以下方法重新赋值,上面方法watch监听不到,具体什么原因,我也不清楚,知道的告知我!谢谢
thispersonal
=
{
data:
resdatadata,
state:
'edit'
}
})
},
}
接下来子组件就能
watch
到
personal
了
子组件
watch:{
personal(newValue,oldValue){
consolelog(181,newValue)
},
/
输出
{
data:
resdatadata,
state:
'edit'
}
/
}
总结
以上所述是小编给大家介绍的解决vue组件props传值对象获取不到的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
您可能感兴趣的文章:vue20
子组件改变props值,并向父组件传值的方法详解vue父子组件间传值(props)vue之父子组件间通信实例讲解(props、$ref、$emit)vue组件中使用props传递数据的实例详解vue父组件向子组件(props)传递数据的方法vue父组件通过props如何向子组件传递方法详解详解vue2父组件传递props异步数据到子组件的问题
ref :被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的 $refs 对象上。如果在普通的DOM元素上使用,那么指向的就是普通的DOM元素。
Vue特点: 数据驱动界面更新, 无需 *** 作DOM来更新界面
也就是说Vue不推荐我们直接 *** 作DOM, 但是在开发中有时候我们确实需要拿到DOM *** 作DOM
那么如果不推荐使用原生的语法获取DOM, 我们应该如何获取DOM
在Vue中如果想要拿到DOM元素我们可以通过ref来获取
例如: <p ref="myP">我是段落</p>
例如 this$refmyP
refs : 一个对象,持有注册过 ref 特性 的所有 DOM 元素和组件实例
注意: refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这只意味着一个直接的子组件封装的“逃生舱”——你应该避免在模板或计算属性中访问 $refs 结语
在讲ref特点之前我们先来回顾, 原生语法获取元素的特点
例如: 通过原生的语法 documentquerySelector 获取到的都是被渲染之后DOM元素, 也就是原生的元素
在Vue中如果想获取原生的元素或者获取自定义的组件, 可以通过ref来获取
拿到了组件后, 还可以访问组件中的数据
vue源码中有一个点不懂(在createElementNS函数中) :
documentcreateElement(namespace + ':' + tagName) ,第一次见到会带冒号的
查了一下MDN上的 createElement ,然后发现不能这样写:
不过实际上也有一个可以指定元素名称空间的 createElementNS函数 , 但是vue 20的诞生时间可能比这个函数早, 所以需要这样写
你这是一个token吧,并不是实际上的cookie,这只算是一个标记,是后端返给你的,后台将数据和token信息加密一并发给前端响应一个token值,每次前端请求接口时都会将这个token标记传到后台,后台通过验证token再将数据返回给你。前端是直接获取不到token的,它跟session差不多
地址: vue-weachat-title
解决问题:
1、Vuejs 单页应用在iOS系统下部分APP的webview中 标题不能通过 documenttitle = xxx 的方式修改 该插件只为解决该问题而生(兼容安卓)
2、在vue单页面中,通过浏览器分享到QQ、微信等应用中的链接,只有一个首页标题和默认icon
已测试:APP 微信 QQ 支付宝 淘宝
在各个组件中随便一个标签中都可写入
或者
若想要动态改变title值:
自定义加载的地址 默认是 /faviconico 可以是相对或者绝对的
汇总:
在详情页中使用,根据不同的文章内容,分享出去的文章标题和都不同
设置动态路由
在toparamstitle中获取标题 修改
之前做微信公众号项目有的这个需求,需要做到只要是用户分享出去的页面,都自动跳转到一个项目介绍页,避免其他用户点进来,因为没有权限访问,而出现页面空白的情况。
原理也是一样,通过 vue-router 的钩子函数,在路由跳转之前,判断一下是否是从分享页面过来的,如果是就重定向到一个通用的分享页面,如果不是,就正常跳转。
1创建一个Vue实例
通过vue函数创建一个新的vue实例
一个 Vue 应用由一个通过new Vue创建的 根 Vue 实例 ,以及可嵌套的、可复用的组件树组成的。
我们先看看Vue基本的使用,至于组件我们后面详细的在来探讨
<divid="app"><!-- {{ 插值表达式,可以赋值 取值 三元 }} -->{{ msg }}</div><scriptsrc="/node_modules\vue\dist\vuejs"></script><script>// 引入vue后 会白给你一个Vue构造函数letvm=newVue({// 配置对象el:'#app',// 告诉vue能管理那个部分,使用的是querySelectordata:{// data中的数据会被vm所代理msg:'hello world',// 可以通过vmmsg取到对应的内容 ,也可以赋值 }})</script>
2声明式渲染
Vuejs 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:
21 关于{{}} 插值表达式
插值表达式,表达式,赋值运算,计算,三元表达式,但是尽量少在这里写逻辑计算
插值:
<!-- HTML ---><divid="app">{{ message }}</div><!-- JS ---><script>newVue({el:'#app',data:{messgae:'hello Vue!'}})</script>
我们已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 Vue 在背后做了大量工作。现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?
如果需要确定现在的数据是否已经和DOM建立了关联,形成响应式
可以将js中的new Vue复制给一个全局变量vm此时vm就是Vue实例化对象,未来可能会用它来搞很多事情,但是最常用到它的时候,是通过this关键字来使用它
varvm=newVue({el:'#app',data:{messgae:'hello Vue!'}})
然后在浏览器的js控制台中修改vmmessage值,同时页面也会发生改变
在控制台中输入
vmmessge="你好,Vue"
22使用 JavaScript 表达式
迄今为止,在我们的模板中,我们一直都只绑定简单的属性键值。但实际上,对于所有的数据绑定,Vuejs 都提供了完全的 JavaScript 表达式支持。
{{ number + 1 }}{{ ok 'YES' : 'NO' }}{{ messagesplit('')reverse()join('') }}<divv-bind:id="'list-' + id"></div>
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。
示例:
<divid="app"><!-- 数字 *** 作 --><p>{{ number + 2 }}</p><!-- 三目运算 --><p>{{ ok 'YES' : 'NO' }}</p><!-- 字符串翻转 --><p>{{ messagesplit('')reverse()join('') }}</p></div><script>constvm=newVue({el:"#app",data:{message:'Hello World',number:10,ok:true,}})</script>
显示结果:
1png
但是有个限制就是,每个绑定双大括号(Mustache语法)里面都只能包含 单个表达式
23 关于data数据
vue关注的是数据变化,不需要在像以前一样关注DOM的变化
比如我想在2秒之后让页面发生变化,我们只需要在2秒后更改数据就可以了
varvm=newVue({el:'#app',data:{msg:'hello world'}})setTimeout(function(){vm$datamsg="bye world"},2000)
关于实例介绍:
示例中vm是Vue的实例对象,
实例对象上有$data属性,其值就是选项对象中data属性值
选项对象就是在实例化Vue时传入的对象
data属性值是一个对象,因此$data也就是这个对象
当通过$data修改msg的值时,也就等于改data中的值, 对应是引用类型
因此示例的结果就是:
2秒后data数据中msg的值改变了, 又因为Vue是始终在关注着msg这个数据,一旦数据发生变化,就会触发Vue的响应式, 继而改变视图显示
24 再次理解MVVM模式
在上一节讲Vue的mvvm模式的时候就有提到,
Vue实例对象就是vm,data数据就是model, 页面显示的结果就是view
再来看一下mvvm的图
mvvmjpg
这张图在配合刚才的示例, 我们就能很好的理解,当数据Model发生变化以后, Vue就可以通过Data Bindings了解到,然后使用新的数据去改变页面显示
至于Vue如何通过DOM Listeners监听页面的改变,来改变数据,这个我们之后讲到在说
3实例上的方法
除了数据属性,Vue 选项对象中还暴露了一些有用的属性与方法。在通过实例对象使用选项对象的属性时,属性前面都需要带上前缀$,以便与用户定义的属性区分开来。例如:
vardata={a:1}varvm=newVue({el:'#example',data:data})vm$data===data// => truevm$el===documentgetElementById('example')// => true
31 实例上常用的属性和方法
vm$attrs// 用户获取父组件传递给子组件的属性,(除props,class,style外)vm$data// vm 上的数据vm$watch// 监听vm$el// 当前el元素vm$set// 后加的属性实现响应式vm$options// vm 配置 上的 所有属性vm$nextTick(()=>{})// 异步方法,等待渲染dom完成后来获取vmvm$refs// 获取dom元素或者组件实例的引用
其实我们可以创建一个Vue实例,然后在控制台上打印这个实例对象,你会看到很多的属性和方法
constvm=newVue({el:"#app",})
在控制台输入vm
显示结果:
实例属性png
这里面很多属性,我们暂时不用去关心他,因为随着学习的深入,慢慢都会学习到的
4实例化多个vue
我们可以在页面上同时实例化多个Vue, 不同的实例接管页面上不同的区域
看下如下的示例:
## <h1>实例化多个Vue对象</h1><divid="app-one"><h2>{{ title }}</h2><p>{{ greet }}</p></div><divid="app-two"><h2>{{ title }}</h2><p>{{ greet }}</p><buttonv-on:click="changeTitle">点击改变app-one的h2的内容</button></div><script>// Vue实例varone=newVue({el:'#app-one',data:{title:" vue-app-one的内容"},computed:{greet:function(){return"Hello App One"}}})// Vue实例vartwo=newVue({el:'#app-two',data:{title:" vue-app-two的内容"},methods:{changeTitle:function(){onetitle="app-one的内容发生改变了"}},computed:{greet:function(){return"Hello App two"}}})</script>
Vue事件和方法还没有讲到, 先做一个了解即可:
示例分析:
两个实例one和two接管了不同的DOM元素,
点击按钮是在two实例接管的DOM元素中,
所以,当你点击时,只会触发two实例中的方法, 也只会改变two实例中的数据
那么问题来了
能否在two实例中修改one实例中的数据呢,
答案当然是可以的啦, 因为变量one是全局变量,
在two实例化中,就可以通过one变量得到第一个Vue实例化对象,
然后就可以通过实例化对象修改数据,这个可以自己尝试写写
5 Vue *** 作DOM元素
虽然Vue是数据驱动的,但是有的时候我们就需要自己手动的获取到DOM元素,对DOM元素进行 *** 作,那么该如何处理呢,
*** 作DOM元素:
在需要 *** 作的DOM元素中使用ref属性,
ref属性的值是自己随便定义的名字
通过Vue实例的$refs属性获取 *** 作dom元素
<divid="app"><divref="wuwei">无为</div></div><script>varvm=newVue({// 根实例el:'#app',data:{},mounted(){//dom元素中有多个一样的ref,dom如果不是通过v-for循环出来的,只能获取一个// 如果是循环出来的,可以获取多个,获取的是一个数组consolelog(this$refswuwei)}});</script>
关于示例中$refs属性的解释:
因为可以在多个DOM元素上使用ref
所以$refs属性获取的是所有具有ref属性的DOM元素的集
因此要想 *** 作确定的DOM元素就需要在通过当初的ref值获取
简而言之: 就是ref在dom元素上通过this$refs自定义名字是获取dom元素
当获取到DOM元素后,然后就可以采用原生的JavaScript对DOM进行 *** 作
注意:
Vue 接管的DOM元素之外的元素使用ref是获取不了的,值是undefined
以上就是关于解决vue组件props传值对象获取不到的问题全部的内容,包括:解决vue组件props传值对象获取不到的问题、13-Vue特殊属性-ref、vue源码中的createElement等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)