- 、vue.js 调用oc的方法并传值

vue.js 组件中调用方法:

methods: {
    gotoDetail(item){
        //此方法需要在移动端实现,这里可以加入判断是不是手机端的判断
        mobileObject.goToSpecialType(item.id,item.type)
    }
},
 
 
oc类.h

//

//  HDSpecialViewController.h

//  headhunter

//

//  Created by peter.zhang on 2017/11/20.

//  Copyright © 2017年 HunterOn. All rights reserved.

//

#import "WebViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>

@interface HDSpecialView:UIView <UIWebViewDelegate>

@property (nonatomic,strong) UIViewController * viewController;

//初始化

- (instancetype)initWithFrame:(CGRect)frame withViewController:(UIViewController *)viewController;

//清空缓存

- (void)clearCacheAndCookie;

@end

@protocol specialJavaScriptDelegate <JSExport>

-(void)goToSpecial:(NSString *)specialId type:(NSString *)type;

@end

@interface SpecialJsModel : NSObject <specialJavaScriptDelegate>

@property (nonatomic, weak) JSContext *jsContext;

@property (nonatomic, weak) UIWebView *webView;

@property (nonatomic,strong) UIViewController *vc;

@end

.m文件

//

//  HDSpecialViewController.m

//  headhunter

//

//  Created by peter.zhang on 2017/11/20.

//  Copyright © 2017年 HunterOn. All rights reserved.

//

#import "HDSpecialView.h"

#import "HDHotSearchViewController.h"

@implementation SpecialJsModel

//JS调用此方法进入高端专场

-(void)goToSpecial:(NSString *)specialId type:(NSString *)type

{

dispatch_async(dispatch_get_main_queue(), ^{

if (specialId&&![specialId isEqualToString:@""]) {

HDHotSearchViewController * vc = [[HDHotSearchViewController alloc]init];

Adver *adver = [[Adver alloc]init];

adver.pictureId = [specialId longLongValue];

adver.type = [type longLongValue];

vc.adver = adver;

[self.vc.navigationController pushViewController:vc animated:YES];

}

});

}

@end

@interface HDSpecialView ()

@property (strong, nonatomic) UIWebView *webView;

@property (nonatomic, strong) JSContext *jsContext;

@property (strong, nonatomic) NSString *urlString;

@end

@implementation HDSpecialView

- (instancetype)initWithFrame:(CGRect)frame withViewController:(UIViewController *)viewController{

self = [super initWithFrame:frame];

if (self) {

self.viewController = viewController;

self.backgroundColor =[UIColor whiteColor];

self.jsContext = [[JSContext alloc] init];

[self initWebView];

}

return self;

}

-(void)clearCacheAndCookie

{

[self cleanCacheAndCookie];

}

-(void)initWebView

{

NSString *str=nil;

#ifdef __DEBUG

//测试环境

str=@"https://xxxxxxxxxxxxx/special.html#/";

#else

//正式环境

str=@"https://xxxxxxxxxxxxx/special.html#/";

#endif

UIWebView *myWebView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0,kScreen_Width,kScreen_Height-kHeight_NavBar - kHeight_TabBar)];

myWebView.delegate =self;

NSURL *url=[NSURL URLWithString:str];

self.webView=myWebView;

[myWebView loadRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:120]];

myWebView.backgroundColor = kColor_BackGround;

[self addSubview:myWebView];

}

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

SpecialJsModel *model  = [[SpecialJsModel alloc] init];

self.jsContext[@"mobileObject"] = model;

model.jsContext = self.jsContext;

model.webView = self.webView;

model.vc = self.viewController;

self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {

context.exception = exceptionValue;

NSLog(@"异常信息:%@", exceptionValue);

};

[MBProgressHUD hideHUDInView:self.viewController.view];

//去除长按后出现的文本选取框

[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];

}

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

{

_urlString=request.URL.absoluteString;

return YES;

}

-(void)setUrlString:(NSString *)urlString

{

_urlString =urlString;

}

/**清除缓存和cookie*/

- (void)cleanCacheAndCookie

{

[self.webView stringByEvaluatingJavaScriptFromString:@"localStorage.clear();"];

//清除cookies

NSHTTPCookie *cookie;

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (cookie in [storage cookies])

{

[storage deleteCookie:cookie];

}

//清除UIWebView的缓存

NSURLCache * cache = [NSURLCache sharedURLCache];

[cache removeAllCachedResponses];

[cache setDiskCapacity:0];

[cache setMemoryCapacity:0];

}

@end

二、oc调用vue.js 组件的方法

在webViewDidFinishLoad 代理方法中调用,因为这个时候vue的所有的组件节点都已经渲染

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//该方法是vue中组件的方法

[self call];

}

- (void)call{

// 之后在回调js的方法Callback把内容传出去

JSValue *Callback = self.jsContext[@"mobileChangeContent"];

//传值给web端

[Callback callWithArguments:@[@"4"]];

}

vue中的实现mobileChangeContent(参数)的方法

1、注意我们都知道调用vue的方法的时候要挂载到window上的方法

随意在组件中需要特殊处理,让组件的方法挂载到window的mobileChangeContent方法上

组件A

mounted(){
     window.mobileChangeContent = this.mobileChangeContent;
},
methods: {
   //实现移动端方法
   mobileChangeContent(level){
       if(level){
       }
    }
}

oc 与 js交互之vue.js的更多相关文章

  1. Vue.js 2 vs Vue.js 3的实现 – 云栖社区

    Vue.js 2 vs Vue.js 3的实现 – 云栖社区 vue.js核心团队已经讨论过将在Vue3实现的变化.虽然API不会改变,但是数据响应机制(译者注:对数据改变的监听和通知)发生了变化.这 ...

  2. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  3. Js 框架之Vue .JS学习记录 ① 与Vue 初识

    目录 与 Vue.js 认识 VUE.JS是个啥?有啥好处? Vue 的目标 战前准备  VUE.JS环境 VUE.JS 尝试一下,你就明白 第一步 实例化VUE 对象 第二步VueAPP 调用数据 ...

  4. 我们为什么以及是如何从 Angular.js 迁移到 Vue.js?

    在我写这篇文章的时候,我们刚刚从我们的应用程序代码库中删除了最后一行AngularJS代码,结束了一个为期4个月的非侵入性工作,将我们的应用程序从AngularJS迁移到VueJS.在这篇文章中,我将 ...

  5. vue.js devtools-------调试vue.js的开发者插件

    vue.js devtools插件: 作用: 以往我们在进行测试代码的时候,直接在console进行查看,其实这个插件雷同于控制台,只不过在vue里面,将需要查看的数据存放在一个变量里面了~ 效果图: ...

  6. JS框架_(Vue.js)带有星期日期的数字时钟

    百度云盘 传送门 密码:tv1v 数字时钟效果: <!doctype html> <html> <head> <meta charset="utf- ...

  7. Windows使用Node.js自动生成Vue.js模版环境部署步骤-----记录

    node.js官网下载并安装node 进入node文档目录下,运行cmd 输入 node -v 查看node版本 出现表示安装完成 输入 npm -v 显示npm版本信息 安装cnpm 输入 npm ...

  8. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  9. MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录

    注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...

随机推荐

  1. PHP封装的一个单例模式Mysql操作类

    掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通 ...

  2. 用一个简单的例子比较SVM,MARS以及BRUTO(R语言)

    背景重述 本文是ESL: 12.3 支持向量机和核中表12.2的重现过程.具体问题如下: 在两个类别中产生100个观测值.第一类有4个标准正态独立特征\(X_1,X_2,X_3,X_4\).第二类也有 ...

  3. ARC068E - Snuke Line

    原题链接 题意简述 给出个区间和.求对于任意,有多少个区间包含的倍数. 题解 考虑怎样的区间不包含的倍数. 对于的倍数和,满足的区间不包含任何的倍数. 于是转化为二维数点问题,可以用可持久化线段树解决 ...

  4. python2.x和python3.x的区别

    一.python2.x和python3.x中raw_input( )和input( )区别 1.在Python2.x中raw_input( )和input( ),两个函数都存在,其中区别为 raw_i ...

  5. pc浏览器css和js计算浏览器宽度的差异以及和滚动条的关系

    如图: css宽度:1250 不包括滚动条宽度 用控制台箭头选取元素显示的左边的宽度:1250  不包含滚动条宽度 缩放浏览器右上角显示的宽度:1267 包含了滚动条宽度 再看下控制台: 由此可计算浏 ...

  6. The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator

    今天遇到一个案例,在使用命令修改一个测试服务器(SQL Server 2014标准版)的服务器排序规则时,遇到了下面错误信息 (具体账号信息脱敏处理,随机生成一个账号密码) The Windows a ...

  7. 进程中调用CreateMutex

    // TestStorage.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #inc ...

  8. yii学习笔记--使用gii快速创建控制器和模型

    配置gii 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'123456',//使用gii的密码 // If ...

  9. CAN总线基础知识(二)

    CAN协议和标准规范 1 由ISO标准化的CAN协议 CAN协议已经由ISO标准化,有2个版本,如ISO11898和ISO11519-2,它们之间在数据链路层没什么不同,但是在物理层有些区别. (1) ...

  10. 硬盘运行与“AHCI 模式”还是“IDE 模式”

    如今SATA硬盘越来越流行,最新购买或者组装的电脑,基本都安装新一代的SATA硬盘,由于绝大多数BIOS初始设置是"IDE模式",安装的windows XP和vista系统,并没有 ...