Don't have the reputation points for a comment but the only way I've figured out how to do this is by using HTML5 session storage. You can add the equivalent of the query string to the session storage, then fire the navToURL event and then on the navigation destination side read from the session storage, get the params, and clear them. It's a hack but the only thing i've figured out so far.
From Summer18 I think one should use lightning:navigation component and the pagereference object that comes along with it .
The link here shows various possibilities within the lightning experience .
Lightning experience internally uses these navigation API so being consistent with the same for partners makes sense .
Here is a simple example
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes">
<aura:attribute name="url" type="String"/>
<aura:attribute name="pageReference" type="Object"/>
<aura:handler name="init" value="{! this }" action="{! c.init }"/>
<lightning:navigation aura:id="navService"/>
<a href="{!v.url}">Link</a>
</aura:component>
Controller code
({
init : function(cmp, event, helper) {
var navService = cmp.find("navService");
// Sets the route to /lightning/o/Account/home
var pageReference = {
type: 'standard__objectPage',
attributes: {
objectApiName: 'Account',
actionName: 'home'
}
};
cmp.set("v.pageReference", pageReference);
// Set the URL on the link or use the default if there's an error
var defaultUrl = "#";
navService.generateUrl(pageReference)
.then($A.getCallback(function(url) {
cmp.set("v.url", url ? url : defaultUrl);
}), $A.getCallback(function(error) {
cmp.set("v.url", defaultUrl);
}));
}
})
Also you can navigate using the navigate API methods as shown
<lightning:navigation aura:id="navService"/>
<a href="{!v.url}" onclick="{!c.handleClick}">Link</a>
<lightning:button label="Navigate" onclick="{!c.handleClick}"/>
controller function
({
handleClick: function(cmp, event, helper) {
var navService = cmp.find("navService");
// Uses the pageReference definition in the init handler
var pageReference = cmp.get("v.pageReference");
event.preventDefault();
navService.navigate(pageReference);
}
})
I don't have a pattern but if anyone manages to build a pattern use lightning:navigationAPI along with the various pagereference types .
(Update from Mark:)
There's a pretty big caveat with the new navigation component currently. (Docs link)
These navigation resources are supported only in Lightning Experience and the Salesforce mobile app. They’re not supported in other containers, such as Lightning Components for Visualforce, Lightning Out. This is true even if you access these containers inside Lightning Experience or the Salesforce mobile app.
Best Answer
Best approach will be to use Salesforce Lightning Console App.
Lightning console app has tabbed structure. They even have an API to open new tabs.
https://developer.salesforce.com/docs/atlas.en-us.api_console.meta/api_console/sforce_api_console_lightning_opentab.htm