Accessing Lightning Component URL Parameters
Introduction
One of the more common challenges when working with Lightning Components is how to access parameters passed on the URL. In a Lightning App it’s straightforward - simply define an attribute with the parameter name:
<aura:application > <aura:attribute name="param1" type="String" /> Param1 = {!v.param1} </aura:application>
and then add that parameter to the URL for the app:
https://kabtutorial-developer-edition.lightning.force.com/KAB_TUTORIAL/UAApp.app?param1=test
and this is picked up and displayed in the resulting page:
However, Lightning Apps are rarely the solution - not least because they execute outside the Lightning Experience.
Accessing via JavaScript
In a Lightning Component’s JavaScript controller or helper, the parameters can be accessed directly from the window location, or with the locker service enabled for a component at API 40 and higher, the secure window location:
getURLParameter : function(param) { var result=decodeURIComponent ((new RegExp('[?|&]' + param + '=' + '([^&;]+?)(&|#|;|$)'). exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null; console.log('Param ' + param + ' from URL = ' + result); return result; }
In case you were wondering, I didn’t come up with the regular expression myself. If it weren’t for stack overflow I suspect I’d be using indexOf and working around errors for some time after.
There’s nothing wrong with this approach, but it feels a little .. clunky.
isUrlAddressable Interface
Summer 18 introduces the lightning:isUrlAddressable interface - I wrote a post about it’s navigational capability a short while ago. Near the bottom of the documentation for this component is an example of how to replace the deprecated force:navigateToComponent with a custom component implementing isUrlAddressable. This example includes an attribute that I hadn’t come across before - v.pageReference - which allows access to the parameters on the URL via the state property.
I can now create a component that accesses the parameters as easily as an app:
<aura:component implements="flexipage:availableForAllPageTypes,lightning:isUrlAddressable" access="global" > <lightning:card> Param1 = {!v.pageReference.state.param1} </lightning:card> </aura:component>
Really? That easy?
Yes and no. It’s that easy if you are navigating directly to a component that implements the isUrlAddressable interface, but not if you are:
- Opening a Lightning Application Page created with the Lightning App Builder
- Inside another component, even if that component implements the isUrlAddressable interface
In these situations, and any other where the component accessing the v.pageReference attribute isn’t that component that you navigated to, the v.pageReference attribute will be undefined and you’ll have to fall back on accessing via JavaScript, as shown earlier.
So definitely a step in the right direction, but not the silver bullet I’m still looking for.
Related Posts
- Lightning Component Navigation in Summer 18
- Toast Message from a Visualforce Page
- Lightning Component Events - Change Types with Care
- Lightning Component Events
- Lightning Components and Unobtrusive JavaScript
- Lightning Components and Custom Apex Classes
- Lightning Component Wrapper Classes
- Trailhead Unit - Handling Events with Client-Side Controllers
Hi,
ReplyDeleteThank you so much for the information. Can you please let me know, how can I navigate to custom lightning component from custom button on record page using URL?
Thanks
Please upvote this idea https://success.salesforce.com/ideaView?id=0873A000000LntQQAS
ReplyDeleteMany thanks for your article. I had no knowledge of the information in the very first section and thanks to your tip, my coding problems have decreased by one. If I may ask, where did you get this piece of information? I have scoured the internet for info on how to access URL parameters but not once did I come across this vital piece. How odd!
ReplyDelete